From f0e5adb10574afb99cbf82eb920bc79bd448b577 Mon Sep 17 00:00:00 2001 From: 10295 <1029559041@qq.com> Date: Mon, 4 Jun 2018 01:28:02 +0800 Subject: [PATCH] =?UTF-8?q?thrift=E5=BC=B9=E5=B9=95=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PixivSearch/dao/Comment.py | 53 +- PixivSearch/dao/bangumi.py | 3 +- PixivSearch/pixiv/pixiv.py | 24 +- PixivSearch/settings.py | 6 +- .../{TestQry => QueryComment}/Client.py | 12 +- .../QueryComment-remote} | 38 +- .../thrift/QueryComment/QueryComment.py | 660 ++++++++++++++++++ PixivSearch/thrift/QueryComment/Server.py | 48 ++ PixivSearch/thrift/QueryComment/__init__.py | 1 + .../{TestQry => QueryComment}/constants.py | 0 PixivSearch/thrift/QueryComment/ttypes.py | 18 + PixivSearch/thrift/TestQry/Server.py | 30 - PixivSearch/thrift/TestQry/TestQry.py | 245 ------- PixivSearch/thrift/TestQry/__init__.py | 1 - PixivSearch/thrift/TestQry/ttypes.py | 91 --- PixivSearch/util/Util.py | 10 + PixivSearch/util/__init__.py | 0 PixivSearch/view.py | 2 +- 18 files changed, 803 insertions(+), 439 deletions(-) rename PixivSearch/thrift/{TestQry => QueryComment}/Client.py (63%) rename PixivSearch/thrift/{TestQry/TestQry-remote => QueryComment/QueryComment-remote} (74%) mode change 100755 => 100644 create mode 100644 PixivSearch/thrift/QueryComment/QueryComment.py create mode 100644 PixivSearch/thrift/QueryComment/Server.py create mode 100644 PixivSearch/thrift/QueryComment/__init__.py rename PixivSearch/thrift/{TestQry => QueryComment}/constants.py (100%) create mode 100644 PixivSearch/thrift/QueryComment/ttypes.py delete mode 100644 PixivSearch/thrift/TestQry/Server.py delete mode 100644 PixivSearch/thrift/TestQry/TestQry.py delete mode 100644 PixivSearch/thrift/TestQry/__init__.py delete mode 100644 PixivSearch/thrift/TestQry/ttypes.py create mode 100644 PixivSearch/util/Util.py create mode 100644 PixivSearch/util/__init__.py diff --git a/PixivSearch/dao/Comment.py b/PixivSearch/dao/Comment.py index 294f423..2a9f5c7 100644 --- a/PixivSearch/dao/Comment.py +++ b/PixivSearch/dao/Comment.py @@ -1,4 +1,6 @@ import json +import os +import shutil import threading from concurrent import futures @@ -25,7 +27,7 @@ class Comment: for index, data in enumerate( sorted(self.obj["data"].items(), key=lambda d: d[1], reverse=True)[ :50]): - print('{index}:{data}'.format(index=index+1, data=data)) + print('{index}:{data}'.format(index=index + 1, data=data)) # 获取番剧合集弹幕排行榜 def count(self, url, desc=None): @@ -60,22 +62,31 @@ def getCidUrls(cid): return urls -# 下载历史弹幕 -def parseXmlByHistory(path, cid,size=None): +# 下载弹幕 +def downloadXml(path, cid, size=None, histroy=True): dlist = set() - flag=parseXml(getCidUrls(cid), dlist, size) - if size is None or not size is None and flag: - f = open(path, 'wb') + flag = None + if histroy: + flag = parseXml(getCidUrls(cid), dlist, size) + else: + parseXml("https://comment.bilibili.com/%d.xml" % cid, dlist, size) + if size is None or (histroy and not size is None and flag): + if os.path.exists(path): + shutil.rmtree(path) + os.makedirs(path) + f = open('{path}/{cid}.xml'.format(path=path, cid=cid), 'wb') f.write(b'') for i in dlist: f.write(('\r\n' + i).encode()) f.write(b'\r\n') f.close() + def xml(url): bytes = requests.get(url).content return etree.HTML(bytes) + def parseXml(urls, dlist, size=None): if isinstance(urls, str): urls = [urls] @@ -92,7 +103,7 @@ def parseXml(urls, dlist, size=None): for element in comment_selector.xpath('//i//d'): if len(element.xpath("text()")) > 0: fstr = '{content}'.format(p=str(element.xpath("@p")[0]), - content=str(element.xpath("text()")[0])) + content=str(element.xpath("text()")[0])) dlist.add(fstr) currentSize = len(dlist) / maxlimit @@ -101,28 +112,8 @@ def parseXml(urls, dlist, size=None): return True return False + if __name__ == '__main__': - # parseXmlByHistory('10815558.xml', 10815558) - # Comment('').getCommentSort(episodeIdToCid(172095)) - cids=[653701,653702,653703,653704,653705,653738,653739,653740,653741,653742,653743,655269,655270,655271,655272,655273,655274,655275,655276,655277,655278,655279,1153426,1160531,1160532,1160533,1160534,1166828,3462691,3526913,4566294,4566295,4566296,4566297,4566298,4566299,4997067,4997068,4997069,4997070,4997071,4997072,4997073,4997074,4997075,4997076,4997077,4997078,4997079,4997080,4997081,4997082,4997083,4997084,4997085,4997086,4997087,4997088,4997089,5679996,7091113,7091114,7091115,7091116,7091117,7091118,7091119,7091120,7102322,7102323,7102324,7105422,7105423,7105424,7105425,7105426,7105427,7105428,7105429,7105430,7105431,7105432,7111387,7862786,7862787,7862788,7862789,7862790,7862791,7862792,7862793,7862794,7862795,7862796,8097054,8462197,8462198,8463198,8463856,8464066,8465726,8466012,8466263,8466715,8467897,8468074,8469339,8470303,8470792,8471514,8471910,8472168,8472542,8473404,8474331,8476130,8974866,9006609,9914921,9914922,9930188,9930189,9930190,9935817,9935818,9935819,9946753,10240252,10240253,10240254,10240255,10240256,10240257,10240258,10240259,10240260,10240261,10240262,12029055,12107619,13109117,13109118,13109119,13109120,13109121,13109122,13109123,13109124,13109125,13109126,13109127,13109128,13109129,13109130,13109131,13109132,13109133,13109134,13109135,13109136,13109137,13109138,13109139,13109140,13109141,13109142,13109143,13109144,13109145,13109146,13109147,13109148,13109149,13109150,13109151,13109152,13109153,13109154,13109155,13280053,13386513,13386514,13386515,13386516,13386517,13386518,13386519,13386520,13386521,13386522,13386523,13494289,14369143,14842278] - - cids=[6675884,6675885,6675886,6722497,6722498,6722499,6722500,6761162,6761163,6761164,6761165,7008191,7008192,7008193,7008194,7008195,7008196,7008197,7008198,7008199,7008200,7008201,7018471,7018472,7018473,7018474,7018475,7018476,7018477,7018478,7018479,7018480,7018481,7636499,7636500,7636501,7636502,7636503,7636504,7636505,7636506,7636507,7636508,7636509,9019798,9019799,9019800,9019801,9019802,9019803,9019804,9019805,9019806,9019807,9019808,9019809,9832709] - for cid in cids: - comment_selector=xml('https://comment.bilibili.com/{cid}.xml'.format(cid=cid)) - print('cid:{cid},弹幕数:{length}'.format(cid=cid,length=len(comment_selector.xpath('//i//d/text()')))) - # parseXmlByHistory('{cid}.xml'.format(cid=cid),cid) - - # path = 'D:/QQ/1029559041/FileRecv/tmp001.xlsx' - # ExcelFile = xlrd.open_workbook(path) - # - # - # for sheetName in ExcelFile.sheet_names(): - # sheet = ExcelFile.sheet_by_name(sheetName) - # for row in sheet.get_rows(): - # try: - # row[5].value.index('日剧') - # cid = int(row[2].value) - # print('aid={aid},cid={cid},title={title}'.format(aid=int(row[1].value),cid=cid,title=row[5].value)) - # parseXmlByHistory('{cid}.xml'.format(cid=cid),cid,'50%') - # except BaseException as e: - # repr(e) + cids = [7636499, 7636501, 7636500, 7636503, 7636504, 7636502, 7636509, 7636508, 7636506, 7636507, 7636505] + + downloadXml('F:/ABC',12026697,histroy=False) diff --git a/PixivSearch/dao/bangumi.py b/PixivSearch/dao/bangumi.py index 6b02cce..4f048f6 100644 --- a/PixivSearch/dao/bangumi.py +++ b/PixivSearch/dao/bangumi.py @@ -184,7 +184,8 @@ def episodeIdToCid(episode_id): if __name__ == '__main__': - print(getCids(29416)) + # print(getCids(29416)) + req=requests.post('https://api.bilibili.com/x/v2/history/shadow/set','') # obj = loadData([34807341], []) diff --git a/PixivSearch/pixiv/pixiv.py b/PixivSearch/pixiv/pixiv.py index a3312b5..17c278f 100644 --- a/PixivSearch/pixiv/pixiv.py +++ b/PixivSearch/pixiv/pixiv.py @@ -1,17 +1,18 @@ #!/usr/bin/env python # coding:utf-8 -from concurrent import futures -import threading import json -import requests -from bs4 import BeautifulSoup +import os import sys +import threading +from concurrent import futures from datetime import datetime -import os -import zipfile + +import requests +from bs4 import BeautifulSoup from PixivSearch.model import config from PixivSearch.settings import logger +from PixivSearch.util import Util headers = { 'X-Requested-With': 'XMLHttpRequest', @@ -74,15 +75,6 @@ def get_Img(params): params[0], params[1]['bookmarkCount'], params[1]['illustTitle'], ','.join(params[1]['tags']), '', params[1]['imgUrl'])) - -def zip(inputFile, outFile): - f = zipfile.ZipFile(outFile, 'w', zipfile.ZIP_DEFLATED) - for dirpath, dirnames, filenames in os.walk(inputFile): - for filename in filenames: - f.write(os.path.join(dirpath, filename), filename) - f.close() - - fsize = '' @@ -119,7 +111,7 @@ def get_nodes(param): zipPath = 'PixivSearch/static/download/' + param[1] + '.zip' logger.info('图片打包到:%s' % (zipPath)) - zip(imgPath, zipPath) + Util.zip(imgPath, zipPath) fsize = str(round(os.path.getsize(zipPath) / float(1024 * 1024), 2)) + 'MB' logger.info('图包大小:%s' % (fsize)) diff --git a/PixivSearch/settings.py b/PixivSearch/settings.py index f584b76..9be76e0 100644 --- a/PixivSearch/settings.py +++ b/PixivSearch/settings.py @@ -79,9 +79,9 @@ DATABASES = { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'bangumi', 'USER': 'root', - 'PASSWORD': 'Luffy9412!', - # 'HOST': '127.0.0.1', - 'HOST': 'mikuhime.xyz', + 'PASSWORD': '', + 'HOST': '127.0.0.1', + # 'HOST': 'sukura.top', 'PORT': '3306', } } diff --git a/PixivSearch/thrift/TestQry/Client.py b/PixivSearch/thrift/QueryComment/Client.py similarity index 63% rename from PixivSearch/thrift/TestQry/Client.py rename to PixivSearch/thrift/QueryComment/Client.py index 89fea10..9abc8e7 100644 --- a/PixivSearch/thrift/TestQry/Client.py +++ b/PixivSearch/thrift/QueryComment/Client.py @@ -1,14 +1,11 @@ -import sys - from thrift.protocol import TBinaryProtocol from thrift.transport import TSocket, TTransport -sys.path.append('/root/PixivSearch') -from PixivSearch.thrift.TestQry.TestQry import Client +from PixivSearch.thrift.QueryComment.QueryComment import Client if __name__ == '__main__': - # Make socket - socket = TSocket.TSocket('mikuhime.xyz', 2233) + + socket = TSocket.TSocket('sukura.top', 2233) # Buffering is critical. Raw sockets are very slow transport = TTransport.TFramedTransport(socket) @@ -22,4 +19,5 @@ if __name__ == '__main__': # Create a client to use the protocol encoder client = Client(protocol) - print(client.qryTest(1)) + cids = [7636499, 7636501, 7636500, 7636503, 7636504, 7636502, 7636509, 7636508, 7636506, 7636507, 7636505] + print(client.commentSumMap(cids)) \ No newline at end of file diff --git a/PixivSearch/thrift/TestQry/TestQry-remote b/PixivSearch/thrift/QueryComment/QueryComment-remote old mode 100755 new mode 100644 similarity index 74% rename from PixivSearch/thrift/TestQry/TestQry-remote rename to PixivSearch/thrift/QueryComment/QueryComment-remote index c12dd5a..a76303e --- a/PixivSearch/thrift/TestQry/TestQry-remote +++ b/PixivSearch/thrift/QueryComment/QueryComment-remote @@ -9,24 +9,24 @@ import sys import pprint -from urllib.parse import urlparse - -from PixivSearch.thrift.TestQry import TestQry - -sys.path.append('/root/PixivSearch') - - +if sys.version_info[0] > 2: + from urllib.parse import urlparse +else: + from urlparse import urlparse from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient from thrift.protocol.TBinaryProtocol import TBinaryProtocol - +from QueryComment import QueryComment +from QueryComment.ttypes import * if len(sys.argv) <= 1 or sys.argv[1] == '--help': print('') print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]') print('') print('Functions:') - print(' QryResult qryTest(i32 qryCode)') + print(' i32 commentSum(i32 cid)') + print(' commentSumList( cids)') + print(' string download( cids, string fileName)') print('') sys.exit(0) @@ -103,14 +103,26 @@ else: else: transport = TTransport.TBufferedTransport(socket) protocol = TBinaryProtocol(transport) -client = TestQry.Client(protocol) +client = QueryComment.Client(protocol) transport.open() -if cmd == 'qryTest': +if cmd == 'commentSum': if len(args) != 1: - print('qryTest requires 1 args') + print('commentSum requires 1 args') + sys.exit(1) + pp.pprint(client.commentSum(eval(args[0]),)) + +elif cmd == 'commentSumList': + if len(args) != 1: + print('commentSumList requires 1 args') + sys.exit(1) + pp.pprint(client.commentSumList(eval(args[0]),)) + +elif cmd == 'download': + if len(args) != 2: + print('download requires 2 args') sys.exit(1) - pp.pprint(client.qryTest(eval(args[0]),)) + pp.pprint(client.download(eval(args[0]), args[1],)) else: print('Unrecognized method %s' % cmd) diff --git a/PixivSearch/thrift/QueryComment/QueryComment.py b/PixivSearch/thrift/QueryComment/QueryComment.py new file mode 100644 index 0000000..9b4bffb --- /dev/null +++ b/PixivSearch/thrift/QueryComment/QueryComment.py @@ -0,0 +1,660 @@ +# +# Autogenerated by Thrift Compiler (0.11.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# options string: py +# + +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException +from thrift.protocol.TProtocol import TProtocolException +from thrift.TRecursive import fix_spec + +import sys +import logging +from .ttypes import * +from thrift.Thrift import TProcessor +from thrift.transport import TTransport +all_structs = [] + + +class Iface(object): + def commentSum(self, cid): + """ + 查询单个cid弹幕数 + + + Parameters: + - cid + """ + pass + + def commentSumList(self, cids): + """ + * 批量查询多个cid弹幕数 + * + + Parameters: + - cids + """ + pass + + def download(self, cids, fileName): + """ + * 批量下载弹幕 + * + + Parameters: + - cids + - fileName + """ + pass + + +class Client(Iface): + def __init__(self, iprot, oprot=None): + self._iprot = self._oprot = iprot + if oprot is not None: + self._oprot = oprot + self._seqid = 0 + + def commentSum(self, cid): + """ + 查询单个cid弹幕数 + + + Parameters: + - cid + """ + self.send_commentSum(cid) + return self.recv_commentSum() + + def send_commentSum(self, cid): + self._oprot.writeMessageBegin('commentSum', TMessageType.CALL, self._seqid) + args = commentSum_args() + args.cid = cid + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_commentSum(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = commentSum_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + raise TApplicationException(TApplicationException.MISSING_RESULT, "commentSum failed: unknown result") + + def commentSumList(self, cids): + """ + * 批量查询多个cid弹幕数 + * + + Parameters: + - cids + """ + self.send_commentSumList(cids) + return self.recv_commentSumList() + + def send_commentSumList(self, cids): + self._oprot.writeMessageBegin('commentSumList', TMessageType.CALL, self._seqid) + args = commentSumList_args() + args.cids = cids + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_commentSumList(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = commentSumList_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + raise TApplicationException(TApplicationException.MISSING_RESULT, "commentSumList failed: unknown result") + + def download(self, cids, fileName): + """ + * 批量下载弹幕 + * + + Parameters: + - cids + - fileName + """ + self.send_download(cids, fileName) + return self.recv_download() + + def send_download(self, cids, fileName): + self._oprot.writeMessageBegin('download', TMessageType.CALL, self._seqid) + args = download_args() + args.cids = cids + args.fileName = fileName + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_download(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = download_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + raise TApplicationException(TApplicationException.MISSING_RESULT, "download failed: unknown result") + + +class Processor(Iface, TProcessor): + def __init__(self, handler): + self._handler = handler + self._processMap = {} + self._processMap["commentSum"] = Processor.process_commentSum + self._processMap["commentSumList"] = Processor.process_commentSumList + self._processMap["download"] = Processor.process_download + + def process(self, iprot, oprot): + (name, type, seqid) = iprot.readMessageBegin() + if name not in self._processMap: + iprot.skip(TType.STRUCT) + iprot.readMessageEnd() + x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name)) + oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid) + x.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + return + else: + self._processMap[name](self, seqid, iprot, oprot) + return True + + def process_commentSum(self, seqid, iprot, oprot): + args = commentSum_args() + args.read(iprot) + iprot.readMessageEnd() + result = commentSum_result() + try: + result.success = self._handler.commentSum(args.cid) + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("commentSum", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + + def process_commentSumList(self, seqid, iprot, oprot): + args = commentSumList_args() + args.read(iprot) + iprot.readMessageEnd() + result = commentSumList_result() + try: + result.success = self._handler.commentSumList(args.cids) + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("commentSumList", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + + def process_download(self, seqid, iprot, oprot): + args = download_args() + args.read(iprot) + iprot.readMessageEnd() + result = download_result() + try: + result.success = self._handler.download(args.cids, args.fileName) + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("download", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + +# HELPER FUNCTIONS AND STRUCTURES + + +class commentSum_args(object): + """ + Attributes: + - cid + """ + + + def __init__(self, cid=None,): + self.cid = cid + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.I32: + self.cid = iprot.readI32() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('commentSum_args') + if self.cid is not None: + oprot.writeFieldBegin('cid', TType.I32, 1) + oprot.writeI32(self.cid) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(commentSum_args) +commentSum_args.thrift_spec = ( + None, # 0 + (1, TType.I32, 'cid', None, None, ), # 1 +) + + +class commentSum_result(object): + """ + Attributes: + - success + """ + + + def __init__(self, success=None,): + self.success = success + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.I32: + self.success = iprot.readI32() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('commentSum_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.I32, 0) + oprot.writeI32(self.success) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(commentSum_result) +commentSum_result.thrift_spec = ( + (0, TType.I32, 'success', None, None, ), # 0 +) + + +class commentSumList_args(object): + """ + Attributes: + - cids + """ + + + def __init__(self, cids=None,): + self.cids = cids + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.LIST: + self.cids = [] + (_etype3, _size0) = iprot.readListBegin() + for _i4 in range(_size0): + _elem5 = iprot.readI32() + self.cids.append(_elem5) + iprot.readListEnd() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('commentSumList_args') + if self.cids is not None: + oprot.writeFieldBegin('cids', TType.LIST, 1) + oprot.writeListBegin(TType.I32, len(self.cids)) + for iter6 in self.cids: + oprot.writeI32(iter6) + oprot.writeListEnd() + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(commentSumList_args) +commentSumList_args.thrift_spec = ( + None, # 0 + (1, TType.LIST, 'cids', (TType.I32, None, False), None, ), # 1 +) + + +class commentSumList_result(object): + """ + Attributes: + - success + """ + + + def __init__(self, success=None,): + self.success = success + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.LIST: + self.success = [] + (_etype10, _size7) = iprot.readListBegin() + for _i11 in range(_size7): + _elem12 = iprot.readI32() + self.success.append(_elem12) + iprot.readListEnd() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('commentSumList_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.LIST, 0) + oprot.writeListBegin(TType.I32, len(self.success)) + for iter13 in self.success: + oprot.writeI32(iter13) + oprot.writeListEnd() + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(commentSumList_result) +commentSumList_result.thrift_spec = ( + (0, TType.LIST, 'success', (TType.I32, None, False), None, ), # 0 +) + + +class download_args(object): + """ + Attributes: + - cids + - fileName + """ + + + def __init__(self, cids=None, fileName=None,): + self.cids = cids + self.fileName = fileName + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.LIST: + self.cids = [] + (_etype17, _size14) = iprot.readListBegin() + for _i18 in range(_size14): + _elem19 = iprot.readI32() + self.cids.append(_elem19) + iprot.readListEnd() + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.STRING: + self.fileName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('download_args') + if self.cids is not None: + oprot.writeFieldBegin('cids', TType.LIST, 1) + oprot.writeListBegin(TType.I32, len(self.cids)) + for iter20 in self.cids: + oprot.writeI32(iter20) + oprot.writeListEnd() + oprot.writeFieldEnd() + if self.fileName is not None: + oprot.writeFieldBegin('fileName', TType.STRING, 2) + oprot.writeString(self.fileName.encode('utf-8') if sys.version_info[0] == 2 else self.fileName) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(download_args) +download_args.thrift_spec = ( + None, # 0 + (1, TType.LIST, 'cids', (TType.I32, None, False), None, ), # 1 + (2, TType.STRING, 'fileName', 'UTF8', None, ), # 2 +) + + +class download_result(object): + """ + Attributes: + - success + """ + + + def __init__(self, success=None,): + self.success = success + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.STRING: + self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('download_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.STRING, 0) + oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(download_result) +download_result.thrift_spec = ( + (0, TType.STRING, 'success', 'UTF8', None, ), # 0 +) +fix_spec(all_structs) +del all_structs + diff --git a/PixivSearch/thrift/QueryComment/Server.py b/PixivSearch/thrift/QueryComment/Server.py new file mode 100644 index 0000000..956f024 --- /dev/null +++ b/PixivSearch/thrift/QueryComment/Server.py @@ -0,0 +1,48 @@ +import os +import sys + +from thrift.server.TNonblockingServer import TNonblockingServer +from thrift.transport import TSocket + +sys.path.append('/root/PixivSearch') +from PixivSearch.util import Util +from PixivSearch.dao.Comment import xml, downloadXml +from PixivSearch.thrift.QueryComment import QueryComment +from PixivSearch.thrift.QueryComment.QueryComment import Iface + +commentPath = '/root/PixivSearch/PixivSearch/thrift/tmpFile/comment' + + +class Server(Iface): + def commentSumList(self, cids): + result = [] + for cid in cids: + comment_selector = xml('https://comment.bilibili.com/{cid}.xml'.format(cid=cid)) + length = len(comment_selector.xpath('//i//d/text()')) + print('cid:{cid},弹幕数:{length}'.format(cid=cid, length=length)) + result.append(length) + return result + + def commentSum(self, cid): + return self.commentSumList([cid])[0]; + + def download(self, cids, fileName): + path = '{commentPath}/{fileName}'.format(commentPath=commentPath, fileName=fileName) + for cid in cids: + downloadXml(path, cid, + histroy=False) + zipFile = '{path}/{fileName}.zip'.format(path=path,fileName=fileName) + print(zipFile) + Util.zip(path, zipFile) + if os.path.isfile(zipFile): + print('压缩包成功生成到{zipFile}'.format(zipFile=zipFile)) + return zipFile + else: + return None + + +if __name__ == '__main__': + socket = TSocket.TServerSocket(port=2233) + processor = QueryComment.Processor(Server()) + server = TNonblockingServer(processor, socket) + server.serve() diff --git a/PixivSearch/thrift/QueryComment/__init__.py b/PixivSearch/thrift/QueryComment/__init__.py new file mode 100644 index 0000000..52b572e --- /dev/null +++ b/PixivSearch/thrift/QueryComment/__init__.py @@ -0,0 +1 @@ +__all__ = ['ttypes', 'constants', 'QueryComment'] diff --git a/PixivSearch/thrift/TestQry/constants.py b/PixivSearch/thrift/QueryComment/constants.py similarity index 100% rename from PixivSearch/thrift/TestQry/constants.py rename to PixivSearch/thrift/QueryComment/constants.py diff --git a/PixivSearch/thrift/QueryComment/ttypes.py b/PixivSearch/thrift/QueryComment/ttypes.py new file mode 100644 index 0000000..9fb0f57 --- /dev/null +++ b/PixivSearch/thrift/QueryComment/ttypes.py @@ -0,0 +1,18 @@ +# +# Autogenerated by Thrift Compiler (0.11.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# options string: py +# + +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException +from thrift.protocol.TProtocol import TProtocolException +from thrift.TRecursive import fix_spec + +import sys + +from thrift.transport import TTransport +all_structs = [] +fix_spec(all_structs) +del all_structs diff --git a/PixivSearch/thrift/TestQry/Server.py b/PixivSearch/thrift/TestQry/Server.py deleted file mode 100644 index a31e9e5..0000000 --- a/PixivSearch/thrift/TestQry/Server.py +++ /dev/null @@ -1,30 +0,0 @@ -import sys - -from thrift.server.TNonblockingServer import TNonblockingServer -from thrift.transport import TSocket - -sys.path.append('/root/PixivSearch') -from PixivSearch.thrift.TestQry import TestQry -from PixivSearch.thrift.TestQry.ttypes import QryResult - - -class QueryImpl(TestQry.Iface): - - def qryTest(self, qryCode): - result = QryResult() - if qryCode == 1: - result.code = 1 - result.msg = 'success' - - else: - result.code = 0 - result.msg = 'fail' - return result - - -if __name__ == '__main__': - socket = TSocket.TServerSocket(port=2233) - processor = TestQry.Processor(QueryImpl()) - server = TNonblockingServer(processor, socket) - - server.serve() diff --git a/PixivSearch/thrift/TestQry/TestQry.py b/PixivSearch/thrift/TestQry/TestQry.py deleted file mode 100644 index 228ef8d..0000000 --- a/PixivSearch/thrift/TestQry/TestQry.py +++ /dev/null @@ -1,245 +0,0 @@ -# -# Autogenerated by Thrift Compiler (0.11.0) -# -# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING -# -# options string: py -# -import logging - -from thrift.TRecursive import fix_spec -from thrift.Thrift import TProcessor -from thrift.Thrift import TType, TMessageType, TApplicationException -from thrift.transport import TTransport - -from PixivSearch.thrift.TestQry.ttypes import QryResult - -all_structs = [] - -class Iface(object): - def qryTest(self, qryCode): - """ - 测试查询接口,当qryCode值为1时返回"成功"的响应信息,qryCode值为其他值时返回"失败"的响应信息 - @param qryCode测试参数 - - Parameters: - - qryCode - """ - pass - - -class Client(Iface): - def __init__(self, iprot, oprot=None): - self._iprot = self._oprot = iprot - if oprot is not None: - self._oprot = oprot - self._seqid = 0 - - def qryTest(self, qryCode): - """ - 测试查询接口,当qryCode值为1时返回"成功"的响应信息,qryCode值为其他值时返回"失败"的响应信息 - @param qryCode测试参数 - - Parameters: - - qryCode - """ - self.send_qryTest(qryCode) - return self.recv_qryTest() - - def send_qryTest(self, qryCode): - self._oprot.writeMessageBegin('qryTest', TMessageType.CALL, self._seqid) - args = qryTest_args() - args.qryCode = qryCode - args.write(self._oprot) - self._oprot.writeMessageEnd() - self._oprot.trans.flush() - - def recv_qryTest(self): - iprot = self._iprot - (fname, mtype, rseqid) = iprot.readMessageBegin() - if mtype == TMessageType.EXCEPTION: - x = TApplicationException() - x.read(iprot) - iprot.readMessageEnd() - raise x - result = qryTest_result() - result.read(iprot) - iprot.readMessageEnd() - if result.success is not None: - return result.success - raise TApplicationException(TApplicationException.MISSING_RESULT, "qryTest failed: unknown result") - - -class Processor(Iface, TProcessor): - def __init__(self, handler): - self._handler = handler - self._processMap = {} - self._processMap["qryTest"] = Processor.process_qryTest - - def process(self, iprot, oprot): - (name, type, seqid) = iprot.readMessageBegin() - if name not in self._processMap: - iprot.skip(TType.STRUCT) - iprot.readMessageEnd() - x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name)) - oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid) - x.write(oprot) - oprot.writeMessageEnd() - oprot.trans.flush() - return - else: - self._processMap[name](self, seqid, iprot, oprot) - return True - - def process_qryTest(self, seqid, iprot, oprot): - args = qryTest_args() - args.read(iprot) - iprot.readMessageEnd() - result = qryTest_result() - try: - result.success = self._handler.qryTest(args.qryCode) - msg_type = TMessageType.REPLY - except TTransport.TTransportException: - raise - except TApplicationException as ex: - logging.exception('TApplication exception in handler') - msg_type = TMessageType.EXCEPTION - result = ex - except Exception: - logging.exception('Unexpected exception in handler') - msg_type = TMessageType.EXCEPTION - result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') - oprot.writeMessageBegin("qryTest", msg_type, seqid) - result.write(oprot) - oprot.writeMessageEnd() - oprot.trans.flush() - -# HELPER FUNCTIONS AND STRUCTURES - - -class qryTest_args(object): - """ - Attributes: - - qryCode - """ - - - def __init__(self, qryCode=None,): - self.qryCode = qryCode - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 1: - if ftype == TType.I32: - self.qryCode = iprot.readI32() - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('qryTest_args') - if self.qryCode is not None: - oprot.writeFieldBegin('qryCode', TType.I32, 1) - oprot.writeI32(self.qryCode) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) -all_structs.append(qryTest_args) -qryTest_args.thrift_spec = ( - None, # 0 - (1, TType.I32, 'qryCode', None, None, ), # 1 -) - - -class qryTest_result(object): - """ - Attributes: - - success - """ - - - def __init__(self, success=None,): - self.success = success - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 0: - if ftype == TType.STRUCT: - self.success = QryResult() - self.success.read(iprot) - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('qryTest_result') - if self.success is not None: - oprot.writeFieldBegin('success', TType.STRUCT, 0) - self.success.write(oprot) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) -all_structs.append(qryTest_result) -qryTest_result.thrift_spec = ( - (0, TType.STRUCT, 'success', [QryResult, None], None, ), # 0 -) -fix_spec(all_structs) -del all_structs - - - - diff --git a/PixivSearch/thrift/TestQry/__init__.py b/PixivSearch/thrift/TestQry/__init__.py deleted file mode 100644 index 22182f6..0000000 --- a/PixivSearch/thrift/TestQry/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__all__ = ['ttypes', 'constants', 'TestQry'] diff --git a/PixivSearch/thrift/TestQry/ttypes.py b/PixivSearch/thrift/TestQry/ttypes.py deleted file mode 100644 index 523a81b..0000000 --- a/PixivSearch/thrift/TestQry/ttypes.py +++ /dev/null @@ -1,91 +0,0 @@ -# -# Autogenerated by Thrift Compiler (0.11.0) -# -# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING -# -# options string: py -# - -from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException -from thrift.protocol.TProtocol import TProtocolException -from thrift.TRecursive import fix_spec - -import sys - -from thrift.transport import TTransport -all_structs = [] - - -class QryResult(object): - """ - Attributes: - - code: 返回码, 1成功,0失败 - - msg: 响应信息 - """ - - - def __init__(self, code=None, msg=None,): - self.code = code - self.msg = msg - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 1: - if ftype == TType.I32: - self.code = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 2: - if ftype == TType.STRING: - self.msg = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('QryResult') - if self.code is not None: - oprot.writeFieldBegin('code', TType.I32, 1) - oprot.writeI32(self.code) - oprot.writeFieldEnd() - if self.msg is not None: - oprot.writeFieldBegin('msg', TType.STRING, 2) - oprot.writeString(self.msg.encode('utf-8') if sys.version_info[0] == 2 else self.msg) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) -all_structs.append(QryResult) -QryResult.thrift_spec = ( - None, # 0 - (1, TType.I32, 'code', None, None, ), # 1 - (2, TType.STRING, 'msg', 'UTF8', None, ), # 2 -) -fix_spec(all_structs) -del all_structs diff --git a/PixivSearch/util/Util.py b/PixivSearch/util/Util.py new file mode 100644 index 0000000..d69b89a --- /dev/null +++ b/PixivSearch/util/Util.py @@ -0,0 +1,10 @@ +import os +import zipfile + + +def zip(inputFile, outFile): + f = zipfile.ZipFile(outFile, 'w', zipfile.ZIP_DEFLATED) + for dirpath, dirnames, filenames in os.walk(inputFile): + for filename in filenames: + f.write(os.path.join(dirpath, filename), filename) + f.close() \ No newline at end of file diff --git a/PixivSearch/util/__init__.py b/PixivSearch/util/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PixivSearch/view.py b/PixivSearch/view.py index d01f309..9153a04 100644 --- a/PixivSearch/view.py +++ b/PixivSearch/view.py @@ -7,13 +7,13 @@ from django.http import Http404, StreamingHttpResponse, HttpResponse from django.shortcuts import render from PixivSearch.dao.bangumi import get_, stop_, getIds +from PixivSearch.pixiv.pixiv import get_nodes from PixivSearch.settings import logger os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PixivSearch.settings") django.setup() # 添加的代码 from PixivSearch.model import config -from PixivSearch.pixiv import get_nodes def search(request):