From 204cf1ed88d12b0840f16f1e64d6b6f2ef4b21ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=B3=E7=A5=9E?= <3162475700@qq.com> Date: Wed, 3 Jul 2024 10:14:43 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=98=A5=E4=BF=AE=E6=94=B9bug=EF=BC=8C?= =?UTF-8?q?=E5=B0=9D=E8=AF=95=E8=AE=A2=E9=98=85=E6=9B=B4=E6=96=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 9 + conf.yaml | 26 ++ conf.yml | 23 -- dev_test/last_articles.json | 44 --- dev_test/main.ipynb | 287 ------------------ .../__pycache__/__init__.cpython-311.pyc | Bin 199 -> 187 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 183 -> 0 bytes .../__pycache__/get_conf.cpython-312.pyc | Bin 690 -> 0 bytes .../__pycache__/get_info.cpython-311.pyc | Bin 11526 -> 11514 bytes .../__pycache__/get_info.cpython-312.pyc | Bin 10425 -> 0 bytes push_rss_update/send_email.py | 67 ++++ .../__pycache__/__init__.cpython-311.pyc | Bin 194 -> 182 bytes .../push_article_update.cpython-311.pyc | Bin 4907 -> 4654 bytes rss_subscribe/push_article_update.py | 3 +- run.py | 54 +++- 15 files changed, 156 insertions(+), 357 deletions(-) create mode 100644 .gitignore create mode 100644 conf.yaml delete mode 100644 conf.yml delete mode 100644 dev_test/last_articles.json delete mode 100644 dev_test/main.ipynb delete mode 100644 friend_circle_lite/__pycache__/__init__.cpython-312.pyc delete mode 100644 friend_circle_lite/__pycache__/get_conf.cpython-312.pyc delete mode 100644 friend_circle_lite/__pycache__/get_info.cpython-312.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..44db8ec --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# 忽略 IDE 配置文件 +.idea/ +.vscode/ + +# 忽略 __pycache__ 文件夹 +**/__pycache__/ + +# 忽略 Jupyter Notebook 文件 +*.ipynb diff --git a/conf.yaml b/conf.yaml new file mode 100644 index 0000000..3ef1b9c --- /dev/null +++ b/conf.yaml @@ -0,0 +1,26 @@ +# 爬虫相关配置 +spider_settings: + enable: false # 是否启用爬虫 + json_url: "https://blog.qyliu.top/friend.json" # 请填写对应格式json的地址,仅支持网络地址 + article_count: 5 # 请填写每个博客需要获取的最大文章数量 + +# 邮箱推送功能配置,还没实现 +email_push: + enable: false # 是否启用邮箱推送功能 + to_email: recipient@example.com # 收件人邮箱地址 + subject: "今天的 RSS 订阅更新" # 邮件主题 + body_template: "rss_template.html" # 邮件正文的 HTML 模板文件 + +# 邮箱issue订阅功能配置 +rss_subscribe: + enable: true # 是否启用邮箱推送功能 + github_username: willow-god # GitHub 用户名 + github_repo: Friend-Circle-Lite # GitHub 仓库名 + your_blog_url: https://blog.qyliu.top/ # 你的博客地址 + +# SMTP 配置 +smtp: + email: 3162475700@qq.com # 发件人邮箱地址 + server: smtp.qq.com # SMTP 服务器地址 + port: 587 # SMTP 端口号 + use_tls: true # 是否使用 tls 加密 diff --git a/conf.yml b/conf.yml deleted file mode 100644 index 58a4e35..0000000 --- a/conf.yml +++ /dev/null @@ -1,23 +0,0 @@ -# 爬虫相关配置 -spider_settings: - enable: true # 是否启用爬虫 - json_url: "https://blog.qyliu.top/friend.json" # 请填写对应格式json的地址,仅支持网络地址 - article_count: 5 # 请填写每个博客需要获取的最大文章数量 - -# 邮箱推送功能配置 -email_push: - enabled: true # 是否启用邮箱推送功能 - to_email: recipient@example.com # 收件人邮箱地址 - subject: "今天的 RSS 订阅更新" # 邮件主题 - body_template: "rss_template.html" # 邮件正文的 HTML 模板文件 - -# SMTP 配置 -smtp: - email: your_email@example.com # 发件人邮箱地址 - server: smtp.example.com # SMTP 服务器地址 - port: 587 # SMTP 端口号 - use_tls: true # 是否使用 TLS 加密 - username: your_smtp_username # SMTP 用户名 - password: your_smtp_password # SMTP 密码 - - diff --git a/dev_test/last_articles.json b/dev_test/last_articles.json deleted file mode 100644 index e5ea8d0..0000000 --- a/dev_test/last_articles.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "articles": [ - { - "title": "东软软件园实习日记", - "author": "", - "link": "https://blog.qyliu.top/posts/13e6e155/", - "published": "2024-07-01 08:39", - "summary": "大学生累成狗,今天我终于理解了为什么这么说,好不容易结束了为期七天的实训课程,又要写实验报告加小组作业,好不容易完成了小组作业,这不,十五天实习又来了!烦!并且还要天天写学习日志?我直接当作日记写好不好!", - "content": "大学生累成狗,今天我终于理解了为什么这么说,好不容易结束了为期七天的实训课程,又要写实验报告加小组作业,好不容易完成了小组作业,这不,十五天实习又来了!烦!并且还要天天写学习日志?我直接当作日记写好不好!" - }, - { - "title": "Github Action实现友链状态检测", - "author": "", - "link": "https://blog.qyliu.top/posts/c2262998/", - "published": "2024-06-23 17:00", - "summary": "随着友情链接数量的增加,人工检测变得繁琐,我最初尝试通过爬取数据进行检测,但数据更新滞后。在群友安小歪的启发下,我采用了GitHub Action自动运行检测脚本,比较有效实现了友链有效性的自动化监测,同时将数据展示在了友情链接页面中,除此之外,原有的摸鱼页面也被我整合到了友链朋友圈页面中。", - "content": "随着友情链接数量的增加,人工检测变得繁琐,我最初尝试通过爬取数据进行检测,但数据更新滞后。在群友安小歪的启发下,我采用了GitHub Action自动运行检测脚本,比较有效实现了友链有效性的自动化监测,同时将数据展示在了友情链接页面中,除此之外,原有的摸鱼页面也被我整合到了友链朋友圈页面中。" - }, - { - "title": "安全跳转页面·插件版", - "author": "", - "link": "https://blog.qyliu.top/posts/1dfd1f41/", - "published": "2024-06-16 17:00", - "summary": "经过两个月的努力,我终于找到了完美的外链跳转解决方案!初始版本使用外置JS存在诸多bug,如图片灯箱、友链和站内跳转链接等问题。经过一段时间的学习和代码调整,我取得了阶段性进展,现在能够实现各种所需功能。最近,我在hexo-external-link插件的基础上进行了底层重构,最终实现了真正的插件版外链替换,不再依赖JS,功能更加完善,且使用更加方便!", - "content": "经过两个月的努力,我终于找到了完美的外链跳转解决方案!初始版本使用外置JS存在诸多bug,如图片灯箱、友链和站内跳转链接等问题。经过一段时间的学习和代码调整,我取得了阶段性进展,现在能够实现各种所需功能。最近,我在hexo-external-link插件的基础上进行了底层重构,最终实现了真正的插件版外链替换,不再依赖JS,功能更加完善,且使用更加方便!" - }, - { - "title": "Alist宝塔部署及其美化", - "author": "", - "link": "https://blog.qyliu.top/posts/a84f5e47/", - "published": "2024-06-04 11:24", - "summary": "Alist 是一个轻量级的目录列表程序,可以用于管理文件索引。将 Alist 部署在宝塔面板中,并进行美化,可以提升用户体验。在本教程中,将介绍我的部署经过,并给出相应的美化代码。", - "content": "Alist 是一个轻量级的目录列表程序,可以用于管理文件索引。将 Alist 部署在宝塔面板中,并进行美化,可以提升用户体验。在本教程中,将介绍我的部署经过,并给出相应的美化代码。" - }, - { - "title": "计算机网络期末总复习", - "author": "", - "link": "https://blog.qyliu.top/posts/8dfa25e1/", - "published": "2024-05-30 16:48", - "summary": "应该注意到标题的改变了吧,本来是一章节一章节的复习,奈何我突然发现,老师画的重点和考研的重点并不是很符合,没办法咯,于是我决定将计算机网络考研复习部分的内容暂时搁置,后面逐步更新,反正一定是会更新的,因为408必考呀!然后将期末复习内容先整理出来,按照老师的考点进行复习。", - "content": "应该注意到标题的改变了吧,本来是一章节一章节的复习,奈何我突然发现,老师画的重点和考研的重点并不是很符合,没办法咯,于是我决定将计算机网络考研复习部分的内容暂时搁置,后面逐步更新,反正一定是会更新的,因为408必考呀!然后将期末复习内容先整理出来,按照老师的考点进行复习。" - } - ] -} \ No newline at end of file diff --git a/dev_test/main.ipynb b/dev_test/main.ipynb deleted file mode 100644 index f2d672b..0000000 --- a/dev_test/main.ipynb +++ /dev/null @@ -1,287 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "正在检查 清羽飞扬 的博客 https://blog.qyliu.top/\n", - "正在检查 张洪Heo 的博客 https://blog.zhheo.com/\n", - "正在检查 Leonus 的博客 https://blog.leonus.cn/\n", - "正在检查 杜老师说 的博客 https://dusays.com\n", - "一府 的博客 https://blog.duolaa.asia/ 无法访问\n", - "正在检查 贰猹 的博客 https://noionion.top/\n", - "正在检查 ChrisKim 的博客 https://www.zouht.com/\n", - "正在检查 無名小栈 的博客 https://blog.imsyy.top/\n", - "正在检查 满心记 的博客 https://blog.lovelu.top/\n", - "正在检查 Tianli 的博客 https://tianli-blog.club/\n", - "不可链接的FEED地址:https://blog.imsyy.top/atom.xml: HTTPSConnectionPool(host='blog.imsyy.top', port=443): Max retries exceeded with url: /404 (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))\n", - "正在检查 Akilar 的博客 https://akilar.top/\n", - "正在检查 星港Star 的博客 https://blog.starsharbor.com\n", - "清风 的博客 https://luckqf.cn 无法访问\n", - "dreamChaser 的博客 https://blog.wenjing.xin/ 无法访问\n", - "正在检查 百里飞洋 的博客 https://blog.meta-code.top/\n", - "正在检查 揽星 的博客 https://lanxing.net/\n", - "正在检查 Android 的博客 https://android99.com\n", - "正在检查 阮一峰 的博客 https://www.ruanyifeng.com/blog/\n", - "正在检查 星辰日记 的博客 https://blog.xsot.cn/\n", - "正在检查 星の野 的博客 https://byer.top/\n", - "正在检查 June 的博客 https://blog.june-pj.cn/\n", - "正在检查 幻雪博客 的博客 https://huanxueblog.top/\n", - "正在检查 风记星辰 的博客 https://www.thyuu.com\n", - "正在检查 呓语梦轩 的博客 https://blog.awaae001.top\n", - "正在检查 青桔气球 的博客 https://blog.qjqq.cn/\n", - "AlenLiu 的博客 https://blog.alenliu.space/ 无法访问\n", - "正在检查 山岳库博 的博客 https://kmar.top/\n", - "JackieZhu 的博客 https://blog.zhfan.top/ 无法访问\n", - "正在检查 微霞 的博客 https://yuuu.org\n", - "Redish 的博客 https://blog.redish101.top/ 无法访问\n", - "Rootlex 的博客 https://blog.nalex.top 无法访问\n", - "GuKaifeng 的博客 https://gukaifeng.cn/ 无法访问\n", - "正在检查 乙未博客 的博客 https://www.yvii.cn\n", - "正在检查 东评西就 的博客 https://dongjunke.cn\n", - "正在检查 Fgaoxing 的博客 https://www.yt-blog.top/\n", - "正在检查 鹊楠 的博客 https://www.quenan.love\n", - "正在检查 Ariasaka 的博客 https://blog.yaria.top/\n", - "理随 的博客 https://lisui.top/ 无法访问\n", - "听风小屋 的博客 https://blog.ifeng.asia/ 无法访问\n", - "正在检查 半方池水 的博客 https://uuanqin.top/\n", - "正在检查 往日信笺 的博客 https://www.xingmail.cn/\n", - "正在检查 皮普 的博客 https://pipuwong.com\n", - "正在检查 luo 的博客 https://www.bokelhc.cn\n", - "正在检查 星空故事 的博客 https://blog.sinzmise.top/\n", - "正在检查 刘郎阁 的博客 https://yjvc.cn/index.php/\n", - "正在检查 obaby 的博客 https://h4ck.org.cn/\n", - "正在检查 湘铭 的博客 https://xiangming.site/\n", - "正在检查 爱吃肉的猫 的博客 https://meuicat.com/\n", - "青竹小轩 的博客 https://gyhwd.top/ 无法访问\n", - "正在检查 星辰 的博客 https://blog.6ing.top/\n", - "正在检查 辞琼 的博客 https://blog.wsq127.top/\n", - "正在检查 Efu 的博客 https://www.efu.me/\n", - "正在检查 茗辰原 的博客 https://mingcy.xyz/\n", - "正在检查 葱苓sama 的博客 https://blog.ciraos.top/\n", - "Fiveth 的博客 https://blog.fiveth.cc/ 无法访问\n", - "正在检查 HiPeach 的博客 https://blog.opeach.cn\n", - "微笔记 的博客 https://flytusky.top 无法访问\n", - "正在检查 微生之最 的博客 https://www.bbixb.top/\n", - "正在检查 蛋蛋困了 的博客 https://blog.wzwzx.cn/\n", - "正在检查 凉心 的博客 https://www.lxink.cn/\n", - "正在检查 陌颜Hao 的博客 https://blog.imoyan.top/\n", - "正在检查 M.Talen 的博客 https://blog.talen.top/\n", - "正在检查 轻笑 的博客 https://www.qcqx.cn/\n", - "正在检查 虹墨 的博客 https://www.imaegoo.com/\n", - "正在检查 痕迹小站 的博客 https://www.henjinet.com/\n", - "Dreamaker 的博客 http://dreamakerr.cn/ 无法访问\n", - "正在检查 纸鹿本鹿 的博客 https://blog.zhilu.cyou\n", - "SerMs 的博客 https://blog.serms.top/ 无法访问\n", - "正在检查 XINGYE 的博客 https://blog.xing-ye.top/\n", - "GanSer 的博客 https://www.gan1ser.top/ 无法访问\n", - "正在检查 六月是只猫 的博客 https://www.lyszm.com/\n", - "正在检查 凌云 的博客 https://www.linyunlink.top/\n", - "ZHI-BLOG 的博客 https://blog.zhwei.tech/ 无法访问\n", - "正在检查 BUZZ 的博客 https://blog.buzzchat.top/\n", - "正在检查 云晓晨 的博客 https://www.catchyxc.com/\n", - "安知鱼 的博客 https://blog.anheyu.com/ 无法访问\n", - "正在检查 唐志远 的博客 https://fe32.top/\n", - "数据处理完成\n", - "总共有 77 位朋友,其中 59 位博客可访问,18 位博客无法访问\n" - ] - } - ], - "source": [ - "# 引入 check_feed 和 parse_feed 函数\n", - "from friend_circle_lite.get_info import fetch_and_process_data\n", - "import json\n", - "\n", - "result = fetch_and_process_data(\"https://blog.qyliu.top/friend.json\")\n", - "\n", - "# 将结果保存为 JSON 文件\n", - "with open(\"result.json\", \"w\", encoding=\"utf-8\") as f:\n", - " json.dump(result, f, ensure_ascii=False, indent=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['atom', 'https://www.linyunlink.top/atom.xml']\n", - "不可链接的FEED地址:['atom', 'https://www.linyunlink.top/atom.xml']: No connection adapters were found for \"['atom', 'https://www.linyunlink.top/atom.xml']\"\n", - "{'website_name': '', 'author': '', 'link': '', 'articles': []}\n" - ] - } - ], - "source": [ - "from friend_circle_lite.get_info import check_feed, parse_feed\n", - "\n", - "url = check_feed(\"https://www.linyunlink.top/\")\n", - "print(url)\n", - "feed = parse_feed(url)\n", - "print(feed)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from friend_circle_lite.get_info import sort_articles_by_time\n", - "\n", - "sorted_result = sort_articles_by_time(result)\n", - "\n", - "# 将结果保存为 JSON 文件\n", - "with open(\"result.json\", \"w\", encoding=\"utf-8\") as f:\n", - " json.dump(sorted_result, f, ensure_ascii=False, indent=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'website_name': '张洪Heo', 'author': '', 'link': 'https://blog.zhheo.com/', 'articles': [{'title': '新配了一个专门玩英雄联盟的台式机主机,分享下配置和过程', 'author': '', 'link': 'https://blog.zhheo.com/p/9a18f6bb.html', 'published': '2024-06-20 01:55', 'summary': '

我只玩英雄联盟这一个网游,之前一直在用我淘汰下来的MacBook Pro 2019 intel i7', 'content': '

我只玩英雄联盟这一个网游,之前一直在用我淘汰下来的MacBook Pro 2019 intel i7'}, {'title': '解决iOS邮箱使用QQ邮箱账户无法发送邮件,连接发信服务器失败问题', 'author': '', 'link': 'https://blog.zhheo.com/p/cb3f5ed0.html', 'published': '2024-06-20 01:53', 'summary': '

我最近从qq邮箱换到了iOS自带的邮件客户端,一方面是因为自从qq邮箱出了会员之后一堆广告,一方面就是iOS18将支持邮件筛选,我也想用用。但是使用QQ邮箱连接会有一些问题。

\\n

一方面是需要授权码验证,这个大家都比较清楚,登录的密码不是你的qq密码,而是qq邮箱', 'content': '

我最近从qq邮箱换到了iOS自带的邮件客户端,一方面是因为自从qq邮箱出了会员之后一堆广告,一方面就是iOS18将支持邮件筛选,我也想用用。但是使用QQ邮箱连接会有一些问题。

\\n

一方面是需要授权码验证,这个大家都比较清楚,登录的密码不是你的qq密码,而是qq邮箱'}, {'title': '要排除的文件已经被上传到远程Git仓库怎么办', 'author': '', 'link': 'https://blog.zhheo.com/p/faf797ab.html', 'published': '2024-06-19 09:43', 'summary': '

mac有个毒瘤文件就是DS_Store,如果没有全局排除掉那么上传新项目的时候很容易就被上传。还有一些其他的构建文件如果没有设置好.gitignore也会被上传。

\\n

有的时候排除文件在我们项目过一段时间后才想起来添加,但是那时候远程库已', 'content': '

mac有个毒瘤文件就是DS_Store,如果没有全局排除掉那么上传新项目的时候很容易就被上传。还有一些其他的构建文件如果没有设置好.gitignore也会被上传。

\\n

有的时候排除文件在我们项目过一段时间后才想起来添加,但是那时候远程库已'}, {'title': 'Mac安装java17(openjdk@17)支持M系列芯片和intel芯片', 'author': '', 'link': 'https://blog.zhheo.com/p/6243d392.html', 'published': '2024-06-17 02:46', 'summary': '

因为入坑Halo插件开发,装环境研究了一个多小时。主要是错误的安装了版本。Halo的java版本要求是17,这个教程介绍安装java17,通过homebrew来进行安装,然后添加链接即可。

\\n

因为入坑Halo插件开发,装环境研究了一个多小时。主要是错误的安装了版本。Halo的java版本要求是17,这个教程介绍安装java17,通过homebrew来进行安装,然后添加链接即可。

\\n

Vision Pro 已经支持了中国大陆销售,售价29999。当然这不是重点,主要Vision', 'content': '

Vision Pro 已经支持了中国大陆销售,售价29999。当然这不是重点,主要Vision'}]}\n" - ] - } - ], - "source": [ - "from friend_circle_lite.get_info import fetch_and_process_data, check_feed, parse_feed\n", - "\n", - "print(parse_feed(check_feed(\"https://blog.zhheo.com/\")[-1]))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "python-dateutil 版本: 2.8.2\n", - "requests 版本: 2.31.0\n", - "feedparser 版本: 6.0.11\n" - ] - } - ], - "source": [ - "import datetime\n", - "import dateutil\n", - "import requests\n", - "import feedparser\n", - "\n", - "# 打印 datetime 包的版本\n", - "\n", - "# 打印 python-dateutil 包的版本\n", - "print(f\"python-dateutil 版本: {dateutil.__version__}\")\n", - "\n", - "# 打印 requests 包的版本\n", - "print(f\"requests 版本: {requests.__version__}\")\n", - "\n", - "# 打印 feedparser 包的版本\n", - "print(f\"feedparser 版本: {feedparser.__version__}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# 将系统路径设置为../\n", - "import sys\n", - "sys.path.append(\"../\")" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"emails\": [\n", - " \"3162475700@qq.com\"\n", - " ]\n", - "}\n" - ] - } - ], - "source": [ - "from rss_subscribe.push_article_update import extract_emails_from_issues\n", - "import json\n", - "\n", - "api_url = \"https://api.github.com/repos/willow-god/Friend-Circle-Lite/issues\"\n", - "emails = extract_emails_from_issues(api_url)\n", - "print(json.dumps(emails, indent=2))" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "从 https://blog.qyliu.top/ 获取到 5 篇文章,其中 0 篇为新文章\n", - "None\n" - ] - } - ], - "source": [ - "from rss_subscribe.push_article_update import get_latest_articles_from_link\n", - "import json\n", - "\n", - "url = \"https://blog.qyliu.top/\"\n", - "articles = get_latest_articles_from_link(url, last_articles_path=\"../rss_subscribe/last_articles.json\")\n", - "print(articles)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/friend_circle_lite/__pycache__/__init__.cpython-311.pyc b/friend_circle_lite/__pycache__/__init__.cpython-311.pyc index d0d08520dbf7b6d6e744d8e3c25f49244612cfdd..995bb7a51e59a9cb99e70ef5755e2a98bc6416e0 100644 GIT binary patch delta 15 WcmX@kxSMf;1CyWYL?``;wO#-!$pu6J delta 27 icmdnZc${&915;G$L??ajl+?2LlGNgo7(Km-1>OLJatVb1 diff --git a/friend_circle_lite/__pycache__/__init__.cpython-312.pyc b/friend_circle_lite/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 41bd267c27b2acdb125653b764c2d35dcc2ce4de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmX@j%ge<81a4oN(?IlN5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!3e(TX&rQ`YD$UDF zEz&Q~FUr<;E6PmGOVM@CEK1Hv)%D3NNyR3V238fH3|1AN15y0}y))=+0|iQKSOh9nV3CxGF7FG%yn(tCJB6N%x91~lgMU(6MKzV)%5_mi zyA1bQ&#TD3s53@tXRV?2@S3N z^i{Xj+JCsY*J^a0Kl=6Y{qFikSUE0NH#%F*-=B8E$Z#Fg%4bc>X4*y1=lZNRtlZnF zbU(anf3Ez~qWk4p`^C#a3u+nuY%~@5k$kJ!*=!6{0pTmLqHm^WbP~jwW4P3E^7FbJ zDDE*QC=`kPf*9%=vpSAhrk delta 31 ncmewr*%r0o1v67r>f~3<`rIk0W$`7c#U(L%dYdI!9%%po)Ts

vH)>hUb3~(#)xuTJ znpoX)WTS!AL&*pw1C&gx5lZI$l+8SehPRQThP4Zv;B4g}uWGaNUXE|DDa7>cdw9;y z{>0;P)wXjEpWxv|gWcQY@U*tMIDun3bUy{s^0m7;x6t9K_jEX2E_-EF#S*6EF{hjL z?DH}W+nJ?HDweEbpyK}JtC;rtm)n@NZP5QQZr5g~P+4`~0~Pn(&y;N5xV?T$8RK&9 z<(LheW3R`?tlz_XTDi)l%kHlL7Ql6zz1hw?lU;0zNhM5w5=qxVqLm~Qs-@t6Jqv2P z2`wR{T3cj+%d~L!6Q`5y0n$&lpx!eQOUe}6h(bb8$<2bCAzC!4Y%0^NSV-^`N$e!t z^gg1U+DYsqcf+Q>K?W3lMGf&pH9-U@n4Mnk(qfQvQ+Ge%r%oqleed}>;IQ02M|lp1 zR>*Up3D|nt_YjPsV<3%%FT^i&#t$8fcOH!oK0DU^;biv*ql4$h&z~F}3`(ucPDthT z_2o4+%*Kt?_4T;tEmP6X@}k!AB9(m0wmx7&5p6<#rvRTk36%(=tn!l=10 zvT*s3xhkTmx;bLV>QxQrERNl&l!aSb52?^5%$n4sg?E{>fkk zZraRS2`z9)SO|m3J0B+aOi>BZH)kzPeMXV!nzm?dwc@jC?K+k6b0rB^$Mgp>_2AY( zZ8toaEvW|=cqP-+!^kQ+pbj3Ud(lytj=Coujp=AD0crppjTyI$Y?JXe)o@Uj4#cstmP)K(ifx5>CD!=NkBWV28Jw~AKF@oB!zUv5DKP`>G z>ih)CfkMRihQu@_}zs=@qyPS`d^9n_Qel;81FhV_TmK~W{NBAz_p^i)m2;u1>Wmj zh6_ymw}+tI%yDcn>iqGCV|Z2*pB^7Q_o_7fSWkbv>z#OK|HPS3C%ey}*&scGr#X6| zCw?G=dcO0_*z3KM&wesGczEL3Pb5-QA38qq>C5p~UuS+^?Dn`h7=G+rmo(caQVWZB zJ_D=z?!pPod6&zxyUEA9m=e%?wrVCNqWH;kRhspw2%-cYl0YC64|PwR>H{{?x)~&0Mrut7YR2jj39KI7(Bhu>?!v2hwMdpI zB{`w3xd$gi0-WG>H%4er@4*Ofdl`dnci|*$>YbLA+*Enb@SdXO+#)MGw5d}ES^3O$ zDDiQ7Pa&%JfGx-IUQvzE%;OU#zkx?qq>+e38qte1nwvwV-q6dE1{wc{@yx(5P->rge9l* z*9U*y;~g>=hWAFzOM@F@rmRlSK~Ilk$h08*^QdV_a6`%UYAz3MOwfR^v7C7) z^~d$$jUVj(a$k>rC}(TP7}Mtr>la4#3;U=``qG#+w`XG{qbOo1N>GHMETKc)vJ1MO zKKgX{fe$u(`B>M}L)rBqLrkANtS^k}3&Y+^`o*Z*hDgT3h+!e>Rw{M-2Sy`|8C@GA z`uqr;fAdBmVX#VbyAA9AcEj{{HpDcBD~5ELVM2`z1#cC|^A8p4t;A=Q73<51&zXuE z74d~NWBp?43mb{9DaBdP0#BS;Qg9^KfQ?Vh22H1v;|6G!^3yHIteTOYBKWM?TUsnL zNTKK^S(;VOPJb6p>386y`q7-MvvUHkL)}XUlmapyaRSaca(?PA%L9CqKM=&@Apd|W zp!Tc$ioK7+(+|FkU%8E7HGVa$CR0Ev0VgmSkY<>XWNt_*0S!nP^)dkMoh2tz+*u+r z#T{1a*Ra~uI0Z8%1Vy|G zDxmc%Srg_`{6i|gR+bk@9J)wjNrRyThNG0gj9L)T38iwGHT#KI3D)A*y-K`BPxXbd z;3w_4LjfjHT0r+J9qbyu?;}&DQM&J}Y#L3x`{vl|U6P4`Od>FimSLD;z(SEQJBiYt z934M>Jl=J9{M~_XgTER5q<12C05b6-CzEIl0N&p@-v7ebu@}ZqhbQ{q89)Dg{P_d% zGan-u|9yA-z+lQ67@N($lEy{ENfRrCFacRl*jkfe?Yj#H0q~`XgXuLo_Wu`3^jdasRi9`S4}gi*1{6-^rs{X zJpPX?E3_Ji$LAK95~o`LOKjrENAb>M(hh(~kYIX)@weWEe9DB14|IaH2IgY?K;PuE zeNq=BIc!*_`a-WHS?BM7XZ+yd7l#LCOiWZhg~A{FO2kcNZ)=0tgs4rKX%H^q(Yeu! z6r5NdDI8IW&l584Bufkr5B4DE^|=I*bc#we-hMogs7?x0Bsnh%WuaY4rlehlmm}F_ zn}J{_{Joz_c3DB8QWwj}?Ot_sRgd@m4Hq8kS~ZkW8`8w)7KSvJHFF@qFl?R|HO~uc z-Zh>w4w)-LbV5Zed0=qir?!u6(aQBbH77S6-*j^8iLKwH#}+ReU_Wx6bw(FI)Wvo? zk2;657G26(bn(&HqOt+{BkfsjbkWMLn(j?UH+47swqcNu<>X$~D${i#71%~|7K9hR zTXw2!D5vroVboS0+!$IL^2N-SuG)X@h*>fdxr8MvWK3ie>&XT(^2mPOd(&`r^7+)tZY%(W(vK)c$+@zt*GL)@y`XsTuyA?u(cnxU5-mWo|(%D<@{n zlH_F3{U@Q+>i(8cLXTVCBG|}h)@Rq5i7#^3Er;9JW^G+H^>t2mT^03pC5iG?O1R!; z03t&T8-P-H)=xYRr2rK`21?2h^wWM)4tq`+A}qNVo;QBGkTU!HYCq{$q>Mrh7yt?c zu{A`e)}h!cISgCo`ZGQlVf! z1yHM&c|cwRc`fP>;H#Vh-$VHT+!RD1bgaIY+D6RaVDQt>*Ek)nf!YLMjj2)a)}aV! z_YpR;Zw-h-0;;#38}E8Pe)ts#K8*Fg81H-$=|mjH82$9r*l+q%8u)hjk;02i3G%X$ zSC8FniGkD)vB7>d^K+yk%NW^N1F!ihyI|*2&gK8Y?MI4WHgM|iOvO^B@Cn-t5=u!C zm^)*Nw2T_XsvDRBkpdU(45Z!s_~V7(6N5wF~b{7FWNhmW3n ze(czQgoqHi@F5ikQ575|hcaIeW$5P+oKJB!3Y=$IVy{@(-^TH!Q)LuH z<~JcCgi5okWm6mPaX|Q{DLKRrpgfGIZ@~pz<{YA6VU*4d)`UvB>PB)GhJV(#Zz%VH zD4iYL6l%Yswsh59Qs<6X3wql7vImNWtSdrVh$7D|3O7dcmVBS4wdz3qq~#=xMDF}> zc65#{mbW0hDw>A0lORy1EFyaupJy7q=k!nu8`Bc_#?HPu(FIkBvKq}EcD|8=bthWDbUzCUN3ioPv2 zjhsrXwd&y7eUDd4r-2xyfCAiG#cZ#Xz`dP%jf7lcoTj_C;Ig8FGb5!q(?XiuQjZ9ZX1oU!W(3b{>!in@H(tQTMz9m!cGj$ix zbAglJ;8%c#rsdL03Z(l2#(+UUQ^Cn^lt%)M3dc5J@*Dlw0SXvEE~b{011a}_H6*hE zv)?RfSXPIl=cRr%tM7nE2OLseOa4?3IS2HH=~4h^RXa^aGg>hxty>9rA#v3ldX$D> zgycTS$OAl7fH0u#g?aKgEsUI-y34a}DV(a4bF5jG0&D420y3oaDgtJ~oN7;(+eu*Gt~j-WQxLX#u4|_i$ZV<^8h!exWU^Hz!*Ta+ucHN1OZ=vrQ8qBA-YdFf=Sdd z>_d_K>3o^n_!|8N;A@)6cS?Tp2#3C(IYJ?^l<<=K0Nr*HB>WDYmR^S1tiECy-@8--m{VeZ)g zF*$)_FN~i55H$955AFX0#qP3-AHo@Oe0(TslY|cJ!I4F6!l5|P2iM>ItdSPUW>sEXZ1-}0TNxE zGv!=HW^l`>Hm^@{SzDSQ(v^jM?cf&X6^HjnbC-Uvq~_|bSh66ZZp`f5dT?uRLtov% zhQXf>8P;Fi5jAX1P(TpTg$M>RA08Pg2uNT zeTxQiql+ILTC_T9U469SigkYYk*IZ1SN+Ya88FgcjWF><88O!u%Pon`Srp5&jm)>b zJNMMwHw%X6uZYfH5m~uqXny@wy((Xq0ROb;YMR!h3f6&0mAZ(o;4(dLgw{rMk4K(t zjd%hHg7_yzJ@O2nBpZ-tsBci*APD7F#T9*8u>R(aog`t%yhbRLR_yMT^yT#FBFi>? zGyj{6h^hXvreVaK0nQz?|M#^l5Y5dS1%x#pIv5K_ESWv(u&Sp$QoM3-{$NHVYxQNz znwTX&oEEh#c*Tgi84GXybv{}W+K^k`C*cenE30{k_-vu3E}QzSjHz9u`rMES`Og=u z)zp^KUo2KY;me1#wT0AInzY&i>Z<}J$}dtv{a2;hI;;At}g&l)FB&zRXhh6`97WU8{xwrKeVBKe)xdKru4lH zSsgm?@Cq{(4uk08*r9`x?LT(pxAAkGlAm(B=Y<{urUXU6ru?pH_>|J@clL2+3?jV^ zosMx*ObpKtKhw8~0U2e;;JdyYF84B3(Xu6x$VLw=pK8Ev4Uddon*u8=9+{hf7-YK_ zp@a0w?Uv?2m%VitYhTk*?DgJ zMBbkX^Ph>d{~#U$Z%CO2x*(%Qk)RZMMNkbj`t+ds8a%&Nb6AL~9wrZ-HR>)2;9YID0VECVW9 z4N?gPwY)VPE)21XwR|;vDO{2;VTKys$x)oLjC_+TIOW;7YZzuTr0`6h$0^UqJ9!_F z5|=5fK#JfRp~+TU-i*SV+qguSxHTDXvE*dtWv^t=oV=$TX;MN7A%}jzqjDkn( zq+L~+kE*h`YO){IVRY4;tSaQDXACr_hz&%@g9wn(MVcT&7evSbiC-Kxx%nxjIjMF< UUXy1E6)GAsT76)^L4dUZ0JG9#Hvj+t delta 627 zcmZ3dvRaLIIWI340}yOrYDqh@k++1EDIs-oGpjy#N@`hrNosLPjGo@+jja0_nOK-N z7qQP|tmklHSO(Ov8l(#hYI#$*S{Q1$F~s?5fNEnEYx!&VQ@ABz${A|-${348Yj_rL z!-bF-HT=sMfu;j71TZr6D3!3ocnl02DLgd{vl&u&Cs%RGGxANI1tj?=@8VQs6qtO6 z)09;(MQDxiWHBypMv=`)Tp~J!3egkKR= zg^PR!*)`dY$3m${1IQ}U1QA+5qL>LtC@2)kfdq7cM3uqhE4SvgH*exoW^@7jU_(66-4{h%uZXxd_}&0pyTKM{(?uc2D?*M9 z-VcP8J}@w`>Vk<5_8Z(n6U?u0OE0j#z^w;Fn^^^f7zK}VNxK>{A2nogHDy0)!RTr_ zSwqlG&lG4^5gUk*2N59aAz=ab1Sk-GaoFVMr