class db(object): def __init__(self, user): self.user = str(user) self.db = SqliteDict(self.getCfgPath(), autocommit=True) def get(self, key=''): return self.db.get(key) if key else self.db.iteritems() def set(self, key='', data=''): if not key: key = self.user if data: self.db[key] = data else: self.db.__delitem__(key) def getCfgPath(self): if os.path.isdir('hoshino'): if not os.path.isdir('hoshino/modules/ASF_Plus/config'): os.mkdir('hoshino/modules/ASF_Plus/config') return os.path.join( os.path.abspath('hoshino/modules/ASF_Plus/config'), f'{self.user}.sqlite') else: if not os.path.isdir('../config'): os.mkdir('../config') return os.path.join(os.path.abspath('../config'), f'{self.user}.sqlite')
class AnguisSqlite(AnguisBase): def __init__(self, path): self.sd = SqliteDict(path, autocommit=True) def __del__(self): super(AnguisSqlite, self).__del__() def __getitem__(self, key): return self.unserialize(self.sd.__getitem__(key)) def __setitem__(self, key, obj): self.sd.__setitem__(key, self.serialize(obj)) def __delitem__(self, key): self.sd.__delitem__(key) def __iter__(self): return self.sd.__iter__() def __len__(self): return len(self.sd)
class Update_window(object): """sitemap更新窗体""" def __init__(self, tree, eblog, sitemap): self.newroot = tk.Toplevel() self.newroot.title('下载文件中') self.newroot.iconbitmap("favicon.ico") self.newroot.wm_attributes('-topmost', 1) win_width = self.newroot.winfo_screenwidth() win_higth = self.newroot.winfo_screenheight() width_adjust = (win_width - 800) / 2 higth_adjust = (win_higth - 250) / 2 self.newroot.geometry("%dx%d+%d+%d" % (800, 250, width_adjust, higth_adjust)) # 进度条 self.bar = ttk.Progressbar(self.newroot, length=740, mode="indeterminate", orient=tk.HORIZONTAL) self.bar.place( x=30, y=150, ) self.bar.start(10) # 提示内容 self.content = tk.Label(self.newroot, text="正在下载Sitemap.xml文件...") self.content.place( x=30, y=30, ) self.content2 = tk.Label(self.newroot, text="下载速度和文件大小以及服务器带宽有关,请耐心等待......", wraplength=740, justify="left") self.content2.place( x=30, y=60, ) self.eblog = eblog self.sitemap = sitemap self.tree = tree self.mydict = SqliteDict('./my_db.sqlite', autocommit=True) # 开启处理线程 self.p = Thread(target=self.update) self.p.setDaemon(True) self.p.start() self.eblog.log("Sitemap线程:开启sitemap线程,下载Sitemap.xml中...") # 关闭右上角 self.newroot.protocol("WM_DELETE_WINDOW", self.close) # 列表添加item,返回iid def append_item(self, item_list): # 加最后/加前面都可以,因为要是前面iid全是1 item = self.tree.insert("", 0, values=(item_list[0], item_list[1], item_list[2], item_list[3])) return item # 处理函数 def update(self): try: with open("sitemap.xml", "wb") as f: f.write(requests.get(self.sitemap).content) with open("sitemap.xml", 'r', encoding='utf-8') as f: xml_data = f.read() self.content.configure(text="Sitemap文件下载完成,正在对比分析....") urls = re.findall(r'<loc>(.+?)</loc>', xml_data, re.S) self.eblog.log("Sitemap线程-->下载Sitemap.xml完成,正在解析xml文件...") tuple_list = list(self.mydict.iteritems()) tree_urls = [i[0] for i in tuple_list] # 求交集 c = list(set(urls).intersection(set(tree_urls))) # tree中多余的 tree_urls_ = list(set(tree_urls).difference(set(c))) # 交集不动,tree把tree中把不是交集的删掉,把siemaop中不是交集的增添上. for key, value in sorted(tuple_list): self.content2.config(text="当前处理-->检查" + key) if key not in c: # 是否删除,看有没有列表 if len(self.tree.get_children()) != 0: self.tree.delete(value[4]) self.mydict.__delitem__(key=key) self.eblog.log("Sitemap线程-->本地删除" + str(tree_urls_)) # sitemap中新添加的 urls_ = list(set(urls).difference(set(c))) for url in sorted(urls_): cur_time = datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S') iid = self.append_item([url, "未提交", "未提交", cur_time]) self.mydict[url] = [url, "未提交", "未提交", cur_time, iid] self.content2.config(text="当前处理-->正在添加" + url) self.eblog.log("Sitemap线程-->本地添加" + str(urls_)) self.eblog.log("Sitemap线程-->关闭sitemap线程,更新完成。") self.close() except: self.eblog.log(traceback.format_exc()) self.eblog.log("Sitemap线程-->更新失败") def close(self): self.newroot.destroy()