Kim wrote: > Random image downloader for specified newsgroup. Hi I'm writing a > small script that will download random images from a specified > newsgroup. I've imported yenc into the script but I can't open the > image or save it. This is my first script so be gentle! > > Heres the script > > > ####random group downloader#### > import nntplib > import string, random > import mimetools > import StringIO > import rfc822 > import sys, base64 > import os > import email > import errno > import mimetypes > > > SERVER = "news.server.co.uk" #Insert news server here > GROUP = "alt.binaries.pictures.blah" #newsgroup will go here > > # connect to server > server = nntplib.NNTP(SERVER) > > resp, count, first, last, name = server.group(GROUP) > > for i in range(10): > try: > id = random.randint(int(first), int(last)) > resp, id, message_id, text = server.article(str(id)) > except (nntplib.error_temp, nntplib.error_perm): > pass # no such message (maybe it was deleted?) > else: > break # found a message! > else: > raise SystemExit > > text = string.join(text, "\n") > file = StringIO.StringIO(text) > > msg = mimetools.Message(file) > > #display message information > #print "File type", "=>", msg.gettype() > #print "Encoding", "=>", msg.getencoding() > #print "plist", "=>", msg.getplist() > > message = rfc822.Message(file) > > for k, v in message.items(): > print k, "=", v > > file = message.fp.read() > > def yenc_decode(file): > # <i>find body</i> > while 1: > line = file.readline() > if not line: > return None > if line[:7] == "=ybegin": > break > # <i>extract data</i> > buffer = [] > while 1: > line = file.readline() > if not line or line[:5] == "=yend": > break > if line[-2:] == "\r\n": > line = line[:-2] > elif line[-1:] in "\r\n": > line = line[:-1] > data = string.split(line, "=") > buffer.append(string.translate(data[0], yenc42)) > for data in data[1:]: > data = string.translate(data, yenc42) > buffer.append(string.translate(data[0], yenc64)) > buffer.append(data[1:]) > return buffer > #the following should write to a text file > #inp = ("file","r") > #outp = open("text.txt","w") > #for line in file: > #outp.write(line) > #print file > #outp.close() >
The following worked for me. It printed text and even generated viewable images when I went to a pictures group. I cleaned it up a little. I'm sure it can be cleaner. That's partly because I didn't want to drift too far from your original and partly because I don't get much Python practice. Don't use "file" as a variable name, it overwrites the built in file object. It likely didn't matter in this case, but would eventually cause problems. ####random group downloader#### import nntplib import random import StringIO import mimetools import rfc822 import binascii #import base64 #import sys #import os #import email #import errno #import mimetypes SERVER = "news.server.co.uk" #Insert news server here GROUP = "alt.binaries.pictures.blah" #newsgroup will go here # connect to server server = nntplib.NNTP(SERVER) resp, count, first, last, name = server.group(GROUP) for i in range(10): try: id = random.randint(int(first), int(last)) resp, id, message_id, text = server.article(str(id)) except (nntplib.error_temp, nntplib.error_perm): pass # no such message (maybe it was deleted?) else: break # found a message! else: raise SystemExit msgFile = StringIO.StringIO("\n".join(text)) # Display mime message information msg = mimetools.Message(msgFile) msgFile.seek(0) print "File type", "=>", msg.gettype() print "Encoding", "=>", msg.getencoding() print "plist", "=>", msg.getplist() # Display rfc822 message information message = rfc822.Message(msgFile) msgFile.seek(0) for k, v in message.items(): print k, "=", v yenc42 = "".join([chr((i - 42) & 255) for i in range(256)]) yenc64 = "".join([chr((i - 64) & 255) for i in range(256)]) def yenc_decode(fileIn): # <i>find body</i> while 1: line = fileIn.readline() if not line: return None if line[:7] == "=ybegin": break # <i>extract data</i> buffer = [] while 1: line = fileIn.readline() if not line or line[:5] == "=yend": break if line[-2:] == "\r\n": line = line[:-2] elif line[-1:] in "\r\n": line = line[:-1] splitData = line.split("=") buffer.append(splitData[0].translate(yenc42)) for data in splitData[1:]: buffer.append(data[0].translate(yenc64).translate(yenc42)) buffer.append(data[1:].translate(yenc42)) return buffer def uu_decode(fileIn): # <i>find body</i> while 1: line = fileIn.readline() if not line: return None if line[:6] == "begin ": break # <i>extract data</i> buffer = [] while 1: line = fileIn.readline() if not line or line[:3] == "end": break buffer.append(binascii.a2b_uu(line)) return buffer # Write the raw message to a text file outp = open("text.txt","w") for line in msgFile: outp.write(line) outp.close() msgFile.seek(0) # Find and convert a yencode or uu encode binary in the message. image = yenc_decode(msgFile) if image == None: msgFile.seek(0) image = uu_decode(msgFile) # output the decoded binary data, if any if image != None: outp = open("text.jpg","wb") outp.write("".join(image)) outp.close() -- http://mail.python.org/mailman/listinfo/python-list