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):
># find body
>while 1:
>line = file.readline()
>if not line:
>return None
>if line[:7] == "=ybegin":
>break
># extract data
>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):
# find body
while 1:
line = fileIn.readline()
if not line:
return None
if line[:7] == "=ybegin":
break
# extract data
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):
# find body
while 1:
line = fileIn.readline()
if not line:
return None
if line[:6] == "begin ":
break