Random image downloader for newsgroups (first script)

Patrick Ellis pellis.nospam at tampabay.rr.com
Fri Sep 8 00:38:33 EDT 2006


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()






More information about the Python-list mailing list