He echado un vistazo para encontrar la respuesta, pero parece que solo puedo encontrar el software que lo haga por usted. ¿Alguien sabe cómo hacer esto en Python?Extraiga el hash SHA1 de un archivo torrent
Respuesta
me escribió una pieza de código Python que verifica los valores hash de los archivos descargados contra de lo que hay en un archivo .torrent . Suponiendo que desea verificar una descarga por corrupción, puede resultar útil.
Necesita el bencode package para usar esto. Bencode es el formato de serialización utilizado en los archivos .torrent. Puede ordenar listas, diccionarios, cadenas y números como JSON.
El código toma los valores hash contenidos en la cadena info['pieces']
:
torrent_file = open(sys.argv[1], "rb")
metainfo = bencode.bdecode(torrent_file.read())
info = metainfo['info']
pieces = StringIO.StringIO(info['pieces'])
Esa cadena contiene una sucesión de 20 bytes hash (una para cada pieza). Estos hashes se comparan con el hash de las piezas de archivo (s) en disco.
La única parte complicada de este código es el manejo de los torrentes de varios archivos debido a que un solo torrente pieza puede abarcar más de un archivo (internamente BitTorrent trata descargas de varios archivos en un único archivo contiguo). Estoy usando la función del generador pieces_generator()
para abstraer eso.
Es posible que desee leer el BitTorrent spec para comprender esto en más detalles.
código completo abajo:
import sys, os, hashlib, StringIO, bencode
def pieces_generator(info):
"""Yield pieces from download file(s)."""
piece_length = info['piece length']
if 'files' in info: # yield pieces from a multi-file torrent
piece = ""
for file_info in info['files']:
path = os.sep.join([info['name']] + file_info['path'])
print path
sfile = open(path.decode('UTF-8'), "rb")
while True:
piece += sfile.read(piece_length-len(piece))
if len(piece) != piece_length:
sfile.close()
break
yield piece
piece = ""
if piece != "":
yield piece
else: # yield pieces from a single file torrent
path = info['name']
print path
sfile = open(path.decode('UTF-8'), "rb")
while True:
piece = sfile.read(piece_length)
if not piece:
sfile.close()
return
yield piece
def corruption_failure():
"""Display error message and exit"""
print("download corrupted")
exit(1)
def main():
# Open torrent file
torrent_file = open(sys.argv[1], "rb")
metainfo = bencode.bdecode(torrent_file.read())
info = metainfo['info']
pieces = StringIO.StringIO(info['pieces'])
# Iterate through pieces
for piece in pieces_generator(info):
# Compare piece hash with expected hash
piece_hash = hashlib.sha1(piece).digest()
if (piece_hash != pieces.read(20)):
corruption_failure()
# ensure we've read all pieces
if pieces.read():
corruption_failure()
if __name__ == "__main__":
main()
No sé si esto resolvió el problema del OP, pero definitivamente resolvió el mío (una vez superado el incumplimiento del paquete bencode: http://stackoverflow.com/questions/2693963/importing-bittorrent-bencode-module). ¡Gracias! –
Siempre quise tener una herramienta así, y estaba a punto de profundizar en el viejo cliente oficial de python para descubrir cómo escribir una. ¡¡Gracias!! – netvope
Según this, usted debería ser capaz de encontrar las md5sums de archivos mediante la búsqueda de la parte de los datos que se parece a:
d[...]6:md5sum32:[hash is here][...]e
(SHA no es parte de la especificación)
Simplemente busque SHA en la página que ha vinculado y verá que se usa extensamente. También cite: 'md5sum: (opcional) un hex de 32 caracteres [...] BitTorrent no lo usa en absoluto, pero está incluido en algunos programas' –
Ah, ya veo, algo así como' d ... ] 9: info_hash [longitud]: [SHA hash] e' –
Me temo que no. Como mencioné en los comentarios de la pregunta, no hay ningún hash SHA1 para los archivos en sí, sino para cada pequeño fragmento de archivo. Los hash de piezas son útiles porque se pueden verificar al principio del proceso de descarga. Tan pronto como tenga una pieza válida, podrá compartirla con otros pares ... Dicho esto, su solución md5 tiene la ventaja de ser simple. Simplemente no está garantizado que esté disponible en todos los archivos .torrent. –
Aquí cómo I'v e extraída valor hash del archivo torrent:
#!/usr/bin/python
import sys, os, hashlib, StringIO
import bencode
def main():
# Open torrent file
torrent_file = open(sys.argv[1], "rb")
metainfo = bencode.bdecode(torrent_file.read())
info = metainfo['info']
print hashlib.sha1(bencode.bencode(info)).hexdigest()
if __name__ == "__main__":
main()
Es el mismo que el comando se ejecuta:
transmissioncli -i test.torrent 2>/dev/null | grep "^hash:" | awk '{print $2}'
Esperanza, que ayuda :)
Lo que eso te da es la * info hash * del torrent. –
+1 ya que eso es exactamente lo que quería hacer cuando visité una pregunta sobre "extraer el hash SHA1 de un archivo torrent". – sjy
Buena pieza pequeña de código, bencode no está en Debian/Ubuntu dist, por lo que tiene que \pip install_ it, o me resulta más fácil utilizar el módulo 'bzrlib.bencode' de _python-bzrlib_. – marcz
- 1. Analizando un archivo torrent - información hash. (Erlang)
- 2. ¿cómo realizaría un hash SHA1 en un archivo?
- 3. ¿Cómo creo un hash SHA1 en ruby?
- 4. Devolver sha1() hash desde couchdb
- 5. hash SHA1 en SQLite: ¿cómo?
- 6. hash SHA1 en Delphi XE
- 7. valores hash Almacenamiento SHA1 en MySQL
- 8. ¿Cómo debo acceder al hash Boost SHA1?
- 9. Hacer un sha1-hash de una fila en Oracle
- 10. Biblioteca hash MD5 y SHA1 C++
- 11. Cómo usar el hash SHA1 en la programación C
- 12. GUNZIP/Extraiga el archivo "parte por parte"
- 13. extraiga y reemplace el archivo que existe
- 14. inválida archivo de firma SHA1
- 15. Secuencia de comandos para cambiar el nombre de los archivos usando un hash sha1() de su nombre de archivo
- 16. hash SHA1 difieren entre openssl y hashlib/pycrypto
- 17. Descarga de un Torrent con libtorrent-pitón
- 18. Generar Hash SHA1 en la Biblioteca de clases portátil
- 19. Establezca el hash de contraseña de Active Directory en un valor SHA1?
- 20. ¿Cómo puedo usar Perl para obtener un hash SHA1 de un archivo desde la línea de comandos de Windows?
- 21. Extraiga 1 archivo de tar.gz con bash
- 22. Lectura del conjunto de archivos de un torrent
- 23. Extraiga el icono del archivo .lnk (acceso directo) de Windows
- 24. Git - la búsqueda de un nombre de archivo de un SHA1
- 25. ¿Por qué el Python calcula "hashlib.sha1" diferente de "git hash-object" para un archivo?
- 26. Error "mal archivo Sha1" de Git
- 27. Extraiga un rango de NSArray
- 28. Extraiga archivos del archivo ZIP con VBScript
- 29. Libtorrent: dado un enlace de imán, ¿cómo se genera un archivo torrent?
- 30. Extraiga bibliotecas vinculadas estáticamente desde un archivo ejecutable
un torrente archivo almacena la del SHA1 de cada uno * piezas * de los archivos compartidos y un SHA1 de los metadatos del torrente * (el hash metainfo) *. ¿Qué hash quieres exactamente? –
Sería el hash de cada una de las piezas. ¿El archivo no contiene un hash para que el archivo completo compruebe si hay errores? –
Algunos archivos .torrent incluyen un hash md5 de cada archivo, pero eso es una extensión opcional del formato de archivo. El hash de piezas se puede usar para verificar la validez de los archivos, por supuesto. Simplemente verifica si todas las piezas están allí y si todas tienen el hash correcto. –