From f6a8da49c358c45f1eb9bf19c0bb10e661eebf8e Mon Sep 17 00:00:00 2001 From: Ringo Watanabe Date: Thu, 2 Aug 2018 09:05:44 +0100 Subject: [PATCH] works now --- rtbw.py | 238 ++++++++++++++++++++++++++++++++++++++++++++++--------- test.dat | Bin 0 -> 54012 bytes 2 files changed, 199 insertions(+), 39 deletions(-) create mode 100644 test.dat diff --git a/rtbw.py b/rtbw.py index 7f8b450..e9271de 100644 --- a/rtbw.py +++ b/rtbw.py @@ -4,6 +4,8 @@ import os.path import traceback import json import socket +import struct +import pprint import time import datetime import json @@ -11,6 +13,7 @@ import re import time import threading import binascii +import pylzma from cffi import FFI import select from subprocess import Popen, PIPE @@ -22,44 +25,178 @@ except ImportError: import requests def __pmap(): - return [ - ("com", "c") - ] + return { + "com": "c", + "thread": "t", + "no": "n", + "sub": "s", + "time": "T", + "name": "N", + "trip": "f", + "country": "C", + "id": "i", + "filename": "F", + "image": "I", + "realFilename": "l", + "fileSize": "S" + } -def __encodepost(post): - pass #TODO: __pmap comp and lzma comp +def log(stre): + print (stre) + +def encode_post(post): + mape = __pmap() + np = dict() + for k,v in post.items(): + nk = k + if(k in mape): + nk = mape[k] + np[nk] = v + js = json.dumps(np) + data = pylzma.compress(js) + #log("Encoded post from %d to %d bytes (%.2f%% reduction)" % (len(js), len(data), 100.00-(len(data)/len(js))*100.00)) + return data + +def decode_post(data): + js = pylzma.decompress(data) + np = json.loads(js) + mape = dict((v,k) for k,v in __pmap().items()) + post = dict() + for k,v in np.items(): + nk = k + if(k in mape): + nk = mape[k] + post[nk] = v + return post class StatBuffer: SLV_LOW = 0 #Keep everything SLV_NOTEXT = 1 #Remove subject & comment - SLV_NOUI = 2 #Remove all user inputed information (sub, com, filename) + SLV_NOPI = 2 #Remove all poster information (sub,com,name,trip) + SLV_NOUI = 3 #Remove all user inputed information (sub, com,name,trip, file info) SLV_HIGH = 0xFF #Keep only post number - def __init__(): + def __init__(self): pass - def _encode(post, striplv): + def _decode(self, data): + if(isinstance(data, int)): + return data + else: + return decode_post(data) + def _encode(self, post, striplv): if(striplv == StatBuffer.SLV_LOW): - return __encodepost(post) + return encode_post(post) elif(striplv == StatBuffer.SLV_NOTEXT): if "com" in post: del post["com"] if "sub" in post: del post["sub"] - return __encodepost(post) + return encode_post(post) + elif(striplv == StatBuffer.SLV_NOPI): + if "com" in post: + del post["com"] + if "sub" in post: + del post["sub"] + if "name" in post: + del post["name"] + if "trip" in post: + del post["trip"] + return encode_post(post) elif(striplv == StatBuffer.SLV_NOUI): if "com" in post: del post["com"] if "sub" in post: del post["sub"] - #TODO: Remove image stuff - return __encodepost(post) + if "name" in post: + del post["name"] + if "trip" in post: + del post["trip"] + if "filename" in post: + del post["filename"] + del post["fileSize"] + del post["realFilename"] + del post["image"] + return encode_post(post) elif(striplv == StatBuffer.SLV_HIGH): - return post["no"] + return encode_post({"no": post["no"]}) else: return None - def write(): + def write(self, post): raise NotImplementedError("Abstract method not implemented") - def read(): + def read(self): raise NotImplementedError("Abstract method not implemented") + def close(self): pass + +class MemoryBuffer(StatBuffer): + def __init__(self, level): + self.lvl = level + self.store = list() + def write(self, post): + data = super()._encode(post, self.lvl) + self.store.append(data) + def raw(self): + return json.dumps(self.store) + def clear(self): + self.store = list() + def length(self): + return len(self.store) + def read(self): + base = super() + return list(base._decode(d) for d in self.store) + def findMax(self): + mx=0 + for ent in self.store: + post = super()._decode(ent) + if(post["no"]>mx): mx = post["no"] + return mx + +class FileBuffer(StatBuffer): + def __init__(self, fn, level): + self.lvl = level + self.file = open(fn, "a+b") + def write(self, post): + data = super()._encode(post, self.lvl) + self.file.write(struct.pack("I", len(data))) + self.file.write(data) + def read(self): + self.file.seek(0) + posts = list() + lentr=self.file.read(4) + while( lentr != None): + if(len(lentr)<4): break + tl = struct.unpack("I", lentr)[0] + #pprint.pprint(tl) + posts.append(super()._decode(self.file.read(tl))) + lentr=self.file.read(4) + self.file.seek(0, 2) + return posts + def length(self): + self.file.seek(0) + maxln = 0 + lentr=self.file.read(4) + while( lentr != None): + if(len(lentr)<4): break + tl = struct.unpack("I", lentr)[0] + self.file.seek(tl, 1) + maxln+=1 + lentr=self.file.read(4)#wonderful language lmao + self.file.seek(0, 2) + return maxln + def close(self): + self.file.close() + def clear(self): + self.file.truncate() + def findMax(self): + self.file.seek(0) + mx=0 + lentr=self.file.read(4) + while( lentr != None): + if(len(lentr)<4): break + tl = struct.unpack("I", lentr)[0] + post = super()._decode(self.file.read(tl)) + if(post["no"] > mx): mx = post["no"] + lentr=self.file.read(4)#wonderful language lmao + self.file.seek(0, 2) + return mx def parse_post(post): res = dict() @@ -94,21 +231,35 @@ def parse_post(post): return res +def parse_thread(api, board, post, last): + fullThread = requests.get((api % board)+"thread/"+str(post["no"])+".json").json() + posts = list() + for fPost in fullThread["posts"]: + if(fPost["no"] > last): + np = parse_post(fPost) + if(np!=None): + posts.append(np) + return posts +#if we spider all pages, go from page 10 to 1 def parse_page(api, board, page, last): dta = requests.get((api % board)+page+".json") posts = list() page = dta.json() + tpd=0 for thread in page["threads"]: post = thread["posts"][0] if post["no"] <= last: - continue + #thread is not new + #are there any new posts? + for vp in thread["posts"]: + if(vp["no"] >last): + posts.extend(parse_thread(api,board,post,last)) + tpd+=1 + break else: - fullThread = requests.get((api % board)+"thread/"+str(post["no"])+".json").json() - for fPost in fullThread["posts"]: - np = parse_post(fPost) - if(np!=None): - posts.append(np) - + posts.extend(parse_thread(api,board, post,last)) + tpd+=1 + log("\t(threads parsed this rotation: %d)"%tpd) return posts def pnomax(last, posts): @@ -117,13 +268,11 @@ def pnomax(last, posts): if(post["no"]>mx): mx = post["no"] #we need this because of sage return mx -def log(stre): - print (stre) def buffer_write(buf, posts): - #TODO: Write buffer stuff - pass - + for post in posts: + buf.write(post) +#TODO: When we request buffer data from daemon, send a min post number to send back (last) parser = argparse.ArgumentParser(description="Real-time 4chan board watcher.") parser.add_argument("board", help="Board to spider") parser.add_argument("timeout", help="Time between cycles") @@ -133,19 +282,30 @@ parser.add_argument("--api", help="Base URL of 4chan JSON API", default="http:// args = parser.parse_args() last=0 +buf = None if args.buffer !=None: - pass #TODO: Init buffer stuff + buf = FileBuffer(args.buffer, StatBuffer.SLV_NOTEXT) +else: + buf = MemoryBuffer(StatBuffer.SLV_NOTEXT) -while True: - log("Reading threads for %s from %d" % (args.board, last)) - posts = parse_page(args.api, args.board, "1", last) - last = pnomax(last, posts) +last = buf.findMax() - if(len(posts)>0): - log("%d new posts since last cycle" % len(posts)) - buffer_write(posts) - else: - log("Nothing new") - - time.sleep(int(args.timeout)) +try: + while True: + log("Reading threads for %s from %d" % (args.board, last)) + posts = parse_page(args.api, args.board, "1", last) + last = pnomax(last, posts) + + if(len(posts)>0): + log("\t%d new posts since last cycle" % len(posts)) + buffer_write(buf, posts) + else: + log("\tnothing new") + log("Buffer written successfully") + + time.sleep(int(args.timeout)) +except(KeyboardInterrupt): + log("Interrupt detected") + buf.close() +log("Closing") diff --git a/test.dat b/test.dat new file mode 100644 index 0000000000000000000000000000000000000000..4d8c32bd2ca5b3fefed607d5927d569c88912204 GIT binary patch literal 54012 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