<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>胖达网络</title>
  <icon>https://www.gravatar.com/avatar/2310ac1440961bb671d298178f7a87bf</icon>
  <subtitle>app966.cn</subtitle>
  <link href="https://www.app966.cn/atom.xml" rel="self"/>
  
  <link href="https://www.app966.cn/"/>
  <updated>2025-01-09T12:48:35.969Z</updated>
  <id>https://www.app966.cn/</id>
  
  <author>
    <name>胖达网络</name>
    <email>838210720@qq.com</email>
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>巨量达人带货建券助手</title>
    <link href="https://www.app966.cn/post/38509d38.html"/>
    <id>https://www.app966.cn/post/38509d38.html</id>
    <published>2024-07-27T13:48:58.000Z</published>
    <updated>2025-01-09T12:48:35.969Z</updated>
    
    <content type="html"><![CDATA[<h1 id="软件功能"><a href="#软件功能" class="headerlink" title="软件功能"></a>软件功能</h1><ul><li>适用对象：24小时直播带货直播间</li><li>监控商品佣金变化，佣金变化时根据设置执行相应的操作</li><li>多个商品使用同一优惠券，大量节省建券资金（最高100个商品）</li><li>软件绑定巨量达人账号，只能监控绑定的巨量达人账号，解绑扣除1天使用时间</li></ul><p><img src="/temp/img/zhushou.png" alt=""></p><h1 id="软件教程"><a href="#软件教程" class="headerlink" title="软件教程"></a>软件教程</h1><ul><li><a href="https://du5hwouc7v.feishu.cn/docx/N3VydoJKwo2nsRxOndRccd23nUe?from=from_copylink">基础教程</a></li></ul><h1 id="下载地址"><a href="#下载地址" class="headerlink" title="下载地址"></a>下载地址</h1><ul><li><a href="https://wwrg.lanzouj.com/b014vn7jre">蓝奏云盘</a></li><li>密码：666666</li></ul><h1 id="软件价格"><a href="#软件价格" class="headerlink" title="软件价格"></a>软件价格</h1><ul><li>1月1控69元，XX控代表可以绑定多少巨量达人账号</li><li>其他版本联系客服咨询</li></ul><h1 id="如何购买"><a href="#如何购买" class="headerlink" title="如何购买"></a>如何购买</h1><ul><li>联系客服微信：ZM15949694093</li><li>联系客服2微信：sr19981106</li><li><a href="http://wpa.qq.com/msgrd?v=3&amp;uin=838210720&amp;site=qq&amp;menu=yes&amp;quot">联系作者</a></li><li>请备注：购买达人带货助手</li></ul><h1 id="声明"><a href="#声明" class="headerlink" title="声明"></a>声明</h1><ul><li>有问题请在此处提交<a href="https://github.com/Superheroff/YJQZS/issues/new">issues</a></li></ul>]]></content>
    
    
    <summary type="html">用于监控直播带货佣金状态，佣金低于xx下架商品，优惠券不足补充优惠券，佣金变低删除优惠券、删除商品、下架直播商品，多个商品使用同一优惠券，大量节省建券资金等功能</summary>
    
    
    
    <category term="软件工具" scheme="https://www.app966.cn/categories/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="软件工具" scheme="https://www.app966.cn/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>三亚5天5夜旅行攻略</title>
    <link href="https://www.app966.cn/post/f5b1d74.html"/>
    <id>https://www.app966.cn/post/f5b1d74.html</id>
    <published>2023-06-25T03:58:09.000Z</published>
    <updated>2023-06-25T04:51:18.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="三亚好吃美食"><a href="#三亚好吃美食" class="headerlink" title="三亚好吃美食"></a>三亚好吃美食</h1><p><strong>海鲜、椰子鸡店</strong><br>这是小红书推荐，非本人推荐</p><ul><li><strong>小胡子海鲜连锁店</strong><br>这家本地人都争相打卡的宝藏海鲜餐厅你们一定不要错过。四川麻辣口味深得我心~香辣蟹一份根本吃不够，还想打包带走一份😋</li><li><strong>琼乡阁·海南私房菜</strong><br>味道超级正宗的海南菜餐厅，店内装饰很有海南特色，拍照很有氛围感~</li><li><strong>太琼百年糟粕醋海鲜火锅</strong><br>我愿意为了这家的糟粕醋再去三亚1000次！酸辣鲜香的锅底涮上海鲜，真的百吃不厌~</li><li><strong>嗲嗲的椰子鸡</strong><br>这家椰子鸡真的太太太好吃了！鲜嫩的鸡肉蘸上秘制蘸料超绝</li><li><strong>林姐香味海鲜</strong><br>本地人开的20多年的海鲜老店，他家的青椒蟹好吃到爆！林姐独家做法质味道特别赞，还有很多口味可以选择</li></ul><p><strong>小吃店</strong><br>这是小红书推荐，非本人推荐</p><ul><li><strong>文妈后安粉</strong>：汤汁鲜美/配料充足一碗就管饱</li><li><strong>阿菊冷饮店</strong>：分量足且价.格低推荐榴莲炒冰，</li><li><strong>渔村炸鸡</strong>：炸鸡外皮酥脆肉质细嫩，配上蜜汁蘸料</li><li><strong>阿公烧烤</strong>：超.级超.级好吃的烧烤!下午2点开门</li><li><strong>正宗抱罗粉</strong>：抱罗粉有干捞和汤的两种</li><li><strong>君瑞陵水酸粉</strong>：汤汁味道鲜美，酸爽可口，分量十足</li><li><strong>清补凉</strong>：炒冰清补凉炒椰奶清补凉好吃</li><li><strong>阿德猪脚饭</strong>：秘.制猪脚是咸口的卤味酱汁</li><li><strong>品汤居砂锅米线</strong>：米线很有嚼劲,配料也多</li><li><strong>南门涮肉</strong>：酱料很香很好吃，就是很北方的调料</li></ul><h1 id="图标释义"><a href="#图标释义" class="headerlink" title="图标释义"></a>图标释义</h1><p>💰代表收费的<br>🤑代表免费的</p><h1 id="租车"><a href="#租车" class="headerlink" title="租车"></a>租车</h1><p>🔹租车时间：6.18 9:00 - 6.21 9:00<br>🔹租特斯拉model Y 3天花费418元💰</p><h1 id="三亚5天5夜悠闲游览路线"><a href="#三亚5天5夜悠闲游览路线" class="headerlink" title="三亚5天5夜悠闲游览路线"></a>三亚5天5夜悠闲游览路线</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">st=&gt;start: 17号到达三亚</span><br><span class="line">e=&gt;end: 返程</span><br><span class="line">tag1=&gt;operation: 第一天 - 三亚湾</span><br><span class="line">tag2=&gt;operation: 第二天 - 三亚湾</span><br><span class="line">tag3=&gt;operation: 第三天 - 海棠湾</span><br><span class="line">tag4=&gt;operation: 第四天 - 亚龙湾</span><br><span class="line">tag5=&gt;operation: 第五天 - 大东海</span><br><span class="line">cond1=&gt;condition: 是否玩的开心？</span><br><span class="line">cond1(no)-&gt;e</span><br><span class="line">cond1(yes)-&gt;tag1</span><br><span class="line">st-&gt;cond1-&gt;tag1(left)-&gt;tag2-&gt;tag3(right)-&gt;tag4-&gt;tag5(left)-&gt;e</span><br></pre></td></tr></table></figure><p><img src="https://sns-img-qc.xhscdn.com/1000g00827g8n70cfm0005n8b7c243a86qs6nq00?imageView2/2/w/1920/format/webp|imageMogr2/strip" alt=""></p><p><strong>🏠抵达落地住宿</strong></p><p><strong>🚌公交方案</strong><br>🔹在<code>凤凰机场</code>上车乘坐8/27至<code>三亚湾新城</code>下车，在<code>京润珍珠博物馆</code>乘坐16路至<code>世纪水晶站</code>（4元/人）💰<br>🔹打车20元左右</p><p>🔹17 - 18号<br>🔹西藏大厦酒店（220元/晚）去哪儿预定💰</p><h2 id="第一天-三亚湾"><a href="#第一天-三亚湾" class="headerlink" title="第一天 - 三亚湾"></a>第一天 - 三亚湾</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">st=&gt;start: 18号早上8点起来取车</span><br><span class="line">e=&gt;end: 回酒店休息</span><br><span class="line">tag1=&gt;operation: 南山文化旅游</span><br><span class="line">tag2=&gt;operation: 大小洞天</span><br><span class="line">tag3=&gt;operation: 椰梦长廊</span><br><span class="line">tag4=&gt;operation: 亿恒夜市</span><br><span class="line">cond1=&gt;condition: 累不累？</span><br><span class="line">cond1(yes)-&gt;e</span><br><span class="line">cond1(no)-&gt;tag1-&gt;tag2-&gt;tag3-&gt;tag4(left)-&gt;e</span><br></pre></td></tr></table></figure><p><strong>南山文化旅游看海上观音（103元/人）💰</strong><br>🔹<code>不要穿拖鞋，不要外带香火</code></p><p><strong>🚌公交方案</strong><br>🔹在<code>世纪水晶站</code>上车乘坐16路至<code>南山景区站</code>（7元/人）💰</p><p><strong>大小洞天拍照🤑</strong><br>🔹<code>适合穿裙子，走路游览</code></p><p><strong>🚌公交方案</strong><br>🔹在<code>南山景区站</code>上车乘坐25路至<code>大小洞天站</code>（4元/人）💰</p><p><strong>椰梦长廊拍照看日落🤑</strong><br>🔹<code>适合傍晚去，蚊虫比较多</code></p><p><strong>🚌公交方案</strong><br>🔹在<code>大小洞天站</code>上车乘坐鹿城山海旅文专线至<code>国光滨海花园</code>（14元/人）💰</p><p><strong>🚗自驾方案</strong><br>🔹导航到<code>海韵酒店、国光豪生酒店</code>对面</p><p><strong>亿恒夜市🤑</strong><br>🌟推荐小吃：<br>🔸蚵仔煎：小生蚝肉和鸡蛋的灵魂搭配，煎到金黄出锅，鲜香嫩滑一步到位<br>🔸海南拌粉：10块钱一大碗，里面有木耳、藕片、黄瓜等很多蔬菜混在一起，好吃又管饱</p><p><strong>🚌公交方案</strong><br>🔹在<code>世嘉公寓</code>上车乘坐29/24/16路至<code>金水湾</code>（2元/人）💰</p><p><strong>🚗自驾方案</strong><br>🔹导航到<code>亿恒·主题夜市</code>停车场</p><p><strong>🍴美食</strong><br>🛎️中午 - 忆山傍餐厅（141.8元）主要吃鸡<br>🛎️晚上 - 去夜市逛吃</p><p><strong>🏠住宿</strong><br>🔹18 - 19号<br>🔹凤凰岛海洋之星度假酒店，180度无敌海景度假房（290元/晚）去哪儿预定💰</p><h2 id="第二天-三亚湾"><a href="#第二天-三亚湾" class="headerlink" title="第二天 - 三亚湾"></a>第二天 - 三亚湾</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">st=&gt;start: 19号开始游玩三亚湾</span><br><span class="line">e=&gt;end: 回酒店休息</span><br><span class="line">tag1=&gt;operation: 西岛一日游（90元/人）</span><br><span class="line">tag2=&gt;operation: 海上书屋</span><br><span class="line">tag3=&gt;operation: 文创区</span><br><span class="line">tag4=&gt;operation: 情侣树</span><br><span class="line">tag5=&gt;operation: 第一市场夜市</span><br><span class="line">cond1=&gt;condition: 累不累？</span><br><span class="line">cond1(yes)-&gt;e</span><br><span class="line">cond1(no)-&gt;tag1-&gt;tag2-&gt;tag3-&gt;tag4-&gt;tag5(left)-&gt;e</span><br></pre></td></tr></table></figure><p><strong>西岛一日游（90元/人）💰</strong><br>🔹<code>电动车去牛王岭门票套餐120/人</code>，不然到西岛买票就是90+35，不去牛王岭可忽略</p><p><strong>🚌公交方案</strong><br>🔹公交车:16/25/26/30/32/55/57路公交车，西岛站下车</p><p><strong>🚗自驾方案</strong><br>🔹西岛肖旗港码头(三亚西岛海洋文化旅游区停车场)，可免费停车</p><p><strong>第一市场夜市🤑</strong><br>🌟推荐小吃：<br>🔸阿菊冷饮：每天都排长队的炒冰店，最好吃的是榴莲炒冰，有新鲜果肉在里面<br>🔸正宗抱罗粉：粘稠的酱汁浇在粗粗的米线上，口感顺滑，里面有肉和粉肠，一起嚼在嘴里很香🦐</p><blockquote><p>第一市场是来三亚必打卡的一个地方，在这里可以超低价买到海鲜、水果和当地的一些特色，还能吃到海南最正宗的美食！尤其是晚上逛夜市，每一个小摊位上都摆满玲琅满目的珍珠首饰、工艺品、小商品，氛围超赞，风情满满！是三亚官方指定的夜市示范街。</p></blockquote><p><strong>🚗自驾方案</strong><br>🔹导航到<code>国药中服免税三亚店</code>停车场</p><p><strong>🍴美食</strong><br>🛎️中午 - 琼乡阁海南私房菜（预计300多元）<br>🛎️晚上 - 去夜市逛吃</p><p><strong>🏠住宿</strong><br>🔹19 - 20号<br>🔹三亚海棠湾和逸泳池别墅，二居泳池别墅（396元/晚）去哪儿预定</p><p><img src="https://sns-img-qc.xhscdn.com/1000g0082i0g11muii0005otvlh0pgpibsomrr28?imageView2/2/h/1920/format/webp|imageMogr2/strip" alt=""></p><h2 id="第三天-海棠湾"><a href="#第三天-海棠湾" class="headerlink" title="第三天 - 海棠湾"></a>第三天 - 海棠湾</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">st=&gt;start: 20号开始游玩海棠湾</span><br><span class="line">e=&gt;end: 回酒店休息</span><br><span class="line">tag1=&gt;operation: 蜈支洲岛一日游（133元/人）</span><br><span class="line">tag2=&gt;inputoutput: 白沙滩、私人定制</span><br><span class="line">tag3=&gt;inputoutput: 情人谷、金龟探海</span><br><span class="line">tag4=&gt;operation: 后海村（冲浪）</span><br><span class="line">tag5=&gt;operation: 博后夜市</span><br><span class="line">cond1=&gt;condition: 累不累？</span><br><span class="line">cond1(yes)-&gt;e</span><br><span class="line">cond1(no)-&gt;tag1-&gt;tag2-&gt;tag3-&gt;tag4-&gt;tag5(left)-&gt;e</span><br></pre></td></tr></table></figure><p><strong>蜈支洲岛一日游（133元/人）💰</strong><br>🔹登岛时间8：00—16：00<br>🔹离岛时间8：30—18：00</p><p><strong>🚌公交方案</strong><br>🔹28/33路公交车、海棠3号大巴</p><p><strong>🚗自驾方案</strong><br>🔹导航“蜈支洲岛”1号/3号停车场<br>🔹<code>提前网上订票，如果要坐旅游观光车环岛游的话买245元/人豪华环岛游套餐</code></p><ul><li>白沙滩</li><li>私人定制</li><li>情人谷</li><li>金龟探海</li></ul><p><img src="https://sns-img-qc.xhscdn.com/1000g0082igjl2u2j40005otvlh0pgpib8hdeh3g?imageView2/2/h/1920/format/webp|imageMogr2/strip" alt=""></p><p><strong>🏄‍♀️岛上玩法</strong><br>第一种：步行拍照<br>步行路线：往左边走→情人岛→love沙滩→动物乐园→私人订制泳池→网红秋千→观海长廊→观日岩<br>第二种：环岛观光<br>环岛路线：海滨浴场→海洋之星→观日岩→情人谷→情人岛→海岛茶馆→私人订制<br>第三种：水上项目<br>蜈支洲岛的水上项目很多，有潜水、摩托艇、水上飞人、彩虹拖伞等等，买套票更划算</p><p><strong>后海村🤑</strong><br>🔹<code>不冲浪可以不去</code>💰<br>🔹太累就不去啦直接回酒店</p><p><strong>博后村夜市🤑</strong><br>🌟推荐小吃：<br>🔸农家炸鸡：新鲜的鸡块裹上满满的面包糠，现炸的吃起来香香脆脆的🐥<br>🔸牛肉后安粉：汤底很鲜，牛肉大块，想喝汤再吃粉，很满足</p><p><strong>🚌公交方案</strong><br>🔹在<code>蜈支洲岛</code>站上车乘坐28路至<code>亚龙湾火车站</code>下车，换乘27路至<code>亚龙湾玫瑰谷</code>下车</p><p><strong>🚗自驾方案</strong><br>🔹导航博后夜市</p><p><strong>🍴美食</strong><br>🛎️中午 - 嗲嗲的椰子鸡（预计300元以上）<br>🛎️晚上 - 去夜市逛吃</p><p><strong>🏠住宿</strong><br>🔹20 - 21号<br>🔹无云谷民宿，随机盲盒房（163元/晚）去哪儿预定</p><h2 id="第四天-亚龙湾"><a href="#第四天-亚龙湾" class="headerlink" title="第四天 - 亚龙湾"></a>第四天 - 亚龙湾</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">st=&gt;start: 21号开始游玩亚龙湾，8点起来还车</span><br><span class="line">e=&gt;end: 回酒店休息</span><br><span class="line">tag1=&gt;operation: 亚龙湾森林公园（130元/人）</span><br><span class="line">tag2=&gt;operation: 亚龙湾沙滩</span><br><span class="line">cond1=&gt;condition: 累不累？</span><br><span class="line">cond1(yes)-&gt;e</span><br><span class="line">cond1(no)-&gt;tag1-&gt;tag2(left)-&gt;e</span><br></pre></td></tr></table></figure><p><strong>亚龙湾森林公园（130元/人）💰</strong><br>🔹<code>提前一小时网上购票预约，蚊虫比较多</code></p><p><strong>🚌公交方案</strong><br>🔹建议骑行或者步行，公交需要50分钟，骑行6分钟，步行23分钟</p><p><strong>亚龙湾沙滩🤑</strong><br>🔹<code>做好防晒，穿拖鞋</code></p><p><strong>🚌公交方案</strong><br>🔹从<code>亚龙湾森林旅游区</code>上车乘坐15/24/25/27至<code>亚龙湾海底世界</code>下车（40分钟左右，2元）<br>🔹骑行5公里19分钟，有共享电动就骑行</p><p><strong>🍴美食</strong><br>🛎️中午 - 就近随便找点吃<br>🛎️晚上 - 太琼百年糟粕醋海鲜火锅（亚龙湾店）（预计400元以上）</p><p><strong>🏠住宿</strong><br>🔹21 - 22号<br>🔹嗨筑·小棠别院艺术酒店，沧山泱水·智能阳台房（151元/晚，有去免税店的免费班车）去哪儿预定</p><p><strong>🚌公交方案</strong><br>🔹从<code>亚龙湾海底世界</code>上车乘坐15/24至<code>新红村路口</code>下车，乘坐23路至<code>龙海风情小镇</code>下车（2小时左右，9元）</p><h2 id="第五天-大东海"><a href="#第五天-大东海" class="headerlink" title="第五天 - 大东海"></a>第五天 - 大东海</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">st=&gt;start: 21号开始游玩大东海</span><br><span class="line">e=&gt;end: 休息准备回家</span><br><span class="line">tag1=&gt;operation: cdf国际免税城</span><br><span class="line">tag2=&gt;operation: 小东海</span><br><span class="line">tag3=&gt;operation: 鹿回头公园</span><br><span class="line">cond1=&gt;condition: 累不累？</span><br><span class="line">cond1(yes)-&gt;e</span><br><span class="line">cond1(no)-&gt;tag1-&gt;tag2-&gt;tag3(left)-&gt;e</span><br></pre></td></tr></table></figure><p><strong>国际免税城🤑</strong><br>🔹买买买条件：<code>年满16岁身份证+离岛信息(车票、船票等)</code></p><p><img src="https://sns-img-qc.xhscdn.com/03036201koykpeu9e2d010vmkqz32ohuba?imageView2/2/w/1920/format/webp|imageMogr2/strip" alt=""><br><strong>小东海🤑</strong><br>🔹<code>做好防晒，穿拖鞋</code></p><p><strong>鹿回头公园🤑</strong><br>🔹<code>适合傍晚去，蚊虫比较多</code></p><p><strong>🍴美食</strong><br>🛎️中午 - 小胡子海鲜连锁店（预计400元左右）<br>🛎️晚上 - 吃烧烤</p><p><strong>🏠住宿</strong><br>🔹22 - 23号<br>🔹亚朵智能酒店，优享大床房（151元/晚）去哪儿预定</p><h1 id="开支明细表"><a href="#开支明细表" class="headerlink" title="开支明细表"></a>开支明细表</h1><div class="table-container"><table><thead><tr><th>项目</th><th>项目明细</th><th>单价/元</th><th>数量/个</th><th>总价/元</th></tr></thead><tbody><tr><td>车票</td><td>首都航空</td><td>410</td><td>2</td><td>820</td></tr><tr><td>交通</td><td>公交、打车</td><td>20</td><td>1</td><td>20</td></tr><tr><td>租车</td><td>特斯拉model Y</td><td>120</td><td>3</td><td>418</td></tr><tr><td>住宿</td><td>西藏大厦酒店</td><td>220</td><td>1</td><td>220</td></tr><tr><td>门票</td><td>南山文化旅游</td><td>103</td><td>2</td><td>206</td></tr><tr><td>吃饭</td><td>忆山傍餐厅</td><td>50</td><td>2</td><td>142</td></tr><tr><td>购物</td><td>亿恒夜市</td><td>100</td><td>2</td><td>200</td></tr><tr><td>住宿</td><td>凤凰岛海洋之星度假酒店</td><td>290</td><td>1</td><td>290</td></tr><tr><td>门票</td><td>西岛</td><td>90</td><td>2</td><td>180</td></tr><tr><td>吃饭</td><td>琼乡阁海南私房菜</td><td>133.3</td><td>2</td><td>400</td></tr><tr><td>购物</td><td>第一市场夜市</td><td>100</td><td>2</td><td>200</td></tr><tr><td>住宿</td><td>三亚海棠湾和逸泳池别墅</td><td>396</td><td>1</td><td>396</td></tr><tr><td>门票</td><td>蜈支洲岛</td><td>133</td><td>2</td><td>266</td></tr><tr><td>吃饭</td><td>嗲嗲的椰子鸡</td><td>133.3</td><td>2</td><td>400</td></tr><tr><td>购物</td><td>博后夜市</td><td>100</td><td>2</td><td>200</td></tr><tr><td>住宿</td><td>无云谷民宿</td><td>163</td><td>1</td><td>163</td></tr><tr><td>门票</td><td>亚龙湾森林公园</td><td>130</td><td>2</td><td>260</td></tr><tr><td>交通</td><td>公交、骑行</td><td>5</td><td>2</td><td>10</td></tr><tr><td>吃饭</td><td>太琼百年糟粕醋海鲜火锅</td><td>150</td><td>2</td><td>450</td></tr><tr><td>住宿</td><td>嗨筑·小棠别院艺术酒店</td><td>151</td><td>1</td><td>151</td></tr><tr><td>交通</td><td>公交</td><td>10</td><td>2</td><td>20</td></tr><tr><td>吃饭</td><td>小胡子海鲜连锁店</td><td>160</td><td>2</td><td>500</td></tr><tr><td>住宿</td><td>亚朵智能酒店</td><td>151</td><td>1</td><td>151</td></tr><tr><td>车票</td><td>首都航空</td><td>500</td><td>2</td><td>1200</td></tr><tr><td>其他</td><td>杂七杂八、充电等</td><td>600</td><td>1</td><td>600</td></tr><tr><td>购物</td><td>买东西</td><td>1000</td><td>2</td><td>2000</td></tr><tr><td><strong>总计</strong></td><td>26</td><td></td><td></td><td><strong>9863</strong></td></tr></tbody></table></div><p><strong>人均：4k-5k左右</strong></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>🔹三亚就是吃和住是大头<br>🔹各个景点距离非常远<br>🔹只有市区才有共享电动车，所以租车非常有必要<br>🔹不要坐3块钱的电动3轮车带你去吃海鲜，会被坑死<br>🔹椰子鸡还是王思聪的椰小鸡好吃，嗲嗲的椰子鸡比较一般<br>🔹喜欢吃辣和重口味的人别去吃太琼百年糟粕醋海鲜火锅和琼乡阁·海南私房菜，你吃了会觉得没有任何味道<br>🔹小吃就是清补凉好吃一点<br>🔹去三亚不需要看天气，基本上天天下雨但是下几分钟就好了，都是太阳和雨一起<br>🔹去西岛、蜈支洲岛要提前1天网上买票，不然也可以在人工窗口买但是更贵<br>🔹去南山文化旅游要提前2小时网上买票<br>🔹租车最好在飞猪租，我是在十八度阳光租的是23款的特斯拉非常奈斯，千万别租油车<br>🔹别去凤凰岛住宿，除了拍照好看其他的一无是处，预算高的可以住康年<br>🔹订贵的酒店可以在酒店的官方微信公众号订会便宜，还有套餐，别管它X天X夜，就是看几夜</p><h1 id="预览和下载"><a href="#预览和下载" class="headerlink" title="预览和下载"></a>预览和下载</h1><p>🔹<a href="https://qcloud.app966.cn/pdf/三亚旅游攻略.pdf">预览PDF</a></p><p>🔹<a href="https://qcloud.app966.cn/pdf/三亚旅游攻略.md">下载markdown</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;三亚好吃美食&quot;&gt;&lt;a href=&quot;#三亚好吃美食&quot; class=&quot;headerlink&quot; title=&quot;三亚好吃美食&quot;&gt;&lt;/a&gt;三亚好吃美食&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;海鲜、椰子鸡店&lt;/strong&gt;&lt;br&gt;这是小红书推荐，非本人推荐&lt;/p&gt;
&lt;ul&gt;
&lt;li</summary>
      
    
    
    
    <category term="生活" scheme="https://www.app966.cn/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="生活" scheme="https://www.app966.cn/tags/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="旅行" scheme="https://www.app966.cn/tags/%E6%97%85%E8%A1%8C/"/>
    
  </entry>
  
  <entry>
    <title>解决jsdelivr国内无法访问的问题</title>
    <link href="https://www.app966.cn/post/b9951e3a.html"/>
    <id>https://www.app966.cn/post/b9951e3a.html</id>
    <published>2023-06-25T03:18:05.000Z</published>
    <updated>2023-06-25T04:09:21.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><ul><li>好久没看博客了，进去一下看到<code>js、css</code>等资源文件全部红色，所以本文章是来解决这个问题的教程</li></ul><h1 id="解决过程"><a href="#解决过程" class="headerlink" title="解决过程"></a>解决过程</h1><ul><li>开启代理又可以使用说明是国内无法使用，那就把jsdelivr替换掉就行了</li><li>一开始是看张洪的<a href="https://blog.zhheo.com/p/790087d9.html">这篇文章</a>，但是是无法解决的</li><li>但是我也不知道是哪个文件里面改，反正肯定不是在<code>config.yml</code></li><li>我是通过把整个<code>butterfly</code>目录下载下来，然后在vscode中全局搜索    <code>jsdelivr</code>，把<code>cdn.jsdelivr.net</code>全局替换成<code>gcore.jsdelivr.net</code>即可</li></ul><h1 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h1><ol><li>打开<code>/butterfly/scripts/events/config.js</code>文件</li><li>在<code>config.js</code>文件中把<code>cdn.jsdelivr.net</code>全局替换成<code>gcore.jsdelivr.net</code></li><li>打开<code>/butterfly/_config.yml</code>文件</li><li>在<code>_config.yml</code>文件中检查<code>inject</code>下插入的css和js把无法打开的替换成<code>gcore.jsdelivr.net</code></li><li>运行<code>hexo clean &amp;&amp; hexo g</code>完美解决</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;好久没看博客了，进去一下看到&lt;code&gt;js、css&lt;/code&gt;等资源文件全部红色，所以本文章是来解决这个问题的教程&lt;/li&gt;</summary>
      
    
    
    
    <category term="Butterfly" scheme="https://www.app966.cn/categories/Butterfly/"/>
    
    
    <category term="Butterfly" scheme="https://www.app966.cn/tags/Butterfly/"/>
    
    <category term="教程" scheme="https://www.app966.cn/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>解决aplayer无法播放的问题</title>
    <link href="https://www.app966.cn/post/13f111f1.html"/>
    <id>https://www.app966.cn/post/13f111f1.html</id>
    <published>2023-01-21T07:54:42.000Z</published>
    <updated>2024-07-27T14:26:18.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><ul><li>做这个的初衷就是<a href="https://github.com/metowolf/Meting">Meting</a>这个项目不稳定且不能满足自己的需求所以才有的这个项目</li><li>我的主要用途是构建博客的歌单列表，所以此项目只是以我博客的需求做的接口</li><li>目前已支持<code>酷狗、网易、QQ、酷我</code>音乐</li><li>如何替换和自定义歌曲请看<a href="/post/a26d3af5.html">这篇文章</a></li><li>请<a href="https://github.com/Superheroff/musicapi">前往Github</a>查看源码</li><li>浏览<a href="https://www.app966.cn/music/">我的歌单</a>查看效果</li></ul><h1 id="如何添加COOKIE以及COOKIE有何作用"><a href="#如何添加COOKIE以及COOKIE有何作用" class="headerlink" title="如何添加COOKIE以及COOKIE有何作用"></a>如何添加COOKIE以及COOKIE有何作用</h1><ul><li><code>MusicApi_set_cookie</code>此方法添加COOKIE</li><li>如果你有会员的情况下是可以下载或试听会员音乐的(<strong>注：禁止商业用途</strong>)</li></ul><h1 id="如何使用"><a href="#如何使用" class="headerlink" title="如何使用"></a>如何使用</h1><ol><li>下载本项目到本地<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">git clone https://github.com/Superheroff/musicapi.git</span><br></pre></td></tr></table></figure></li><li>安装环境依赖<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pip install -r requirements.txt</span><br></pre></td></tr></table></figure></li><li>运行项目<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">python main.py</span><br></pre></td></tr></table></figure></li></ol><h1 id="请求示例"><a href="#请求示例" class="headerlink" title="请求示例"></a>请求示例</h1><ul><li><strong>获取歌单列表信息</strong></li><li>请求地址：<code>http://127.0.0.1:7878</code></li><li>路径：<code>/music/songlist</code></li><li>请求方式：<code>POST,GET</code></li><li>酷狗音乐示例：<code>http://127.0.0.1:7878/music/songlist?server=kugou&amp;id=6222311</code></li><li>网易云音乐示例：<code>http://127.0.0.1:7878/music/songlist?server=wyy&amp;id=7480897649</code></li><li>QQ音乐示例：<code>http://127.0.0.1:7878/music/songlist?server=qqmusic&amp;id=8672698451</code></li><li>酷我音乐示例：<code>http://127.0.0.1:7878/music/songlist?server=kuwo&amp;id=3563672431</code></li><li>酷我获取推荐歌单列表示例：<code>http://127.0.0.1:7878/kuwo/random_music_list</code></li></ul><div class="table-container"><table><thead><tr><th>参数名</th><th>参数类型</th><th>参数描述</th><th>参数示例</th></tr></thead><tbody><tr><td>server</td><td>string</td><td>音乐平台</td><td>kugou,wyy,qqmusic,kuwo</td></tr><tr><td>id</td><td>string</td><td>歌单ID</td><td>6222311,7480897649,8672698451,3563672431</td></tr></tbody></table></div><h1 id="响应示例"><a href="#响应示例" class="headerlink" title="响应示例"></a>响应示例</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">[</span><br><span class="line">  &#123;</span><br><span class="line">    &quot;author&quot;: &quot;小霞、海洋Bo&quot;,</span><br><span class="line">    &quot;lrc&quot;: &quot;http://127.0.0.1:7878/kugou/lrc/2E6D88A0CA2290BA32B614FC9C7EA43B.lrc&quot;,</span><br><span class="line">    &quot;music_id&quot;: &quot;2E6D88A0CA2290BA32B614FC9C7EA43B&quot;,</span><br><span class="line">    &quot;pic&quot;: &quot;http://imge.kugou.com/stdmusic/20230607/20230607152301805906.jpg&quot;,</span><br><span class="line">    &quot;title&quot;: &quot;向云端&quot;,</span><br><span class="line">    &quot;url&quot;: &quot;http://127.0.0.1:7878/kugou/2E6D88A0CA2290BA32B614FC9C7EA43B&quot;</span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    &quot;author&quot;: &quot;张叶蕾&quot;,</span><br><span class="line">    &quot;lrc&quot;: &quot;http://127.0.0.1:7878/wyy/lrc/2152040455.lrc&quot;,</span><br><span class="line">    &quot;music_id&quot;: &quot;2152040455&quot;,</span><br><span class="line">    &quot;pic&quot;: &quot;https://p2.music.126.net/zqd0535UOc3EDJvFf0Ymjw==/109951169555226745.jpg&quot;,</span><br><span class="line">    &quot;title&quot;: &quot;爱你&quot;,</span><br><span class="line">    &quot;url&quot;: &quot;http://127.0.0.1:7878/wyy/2152040455&quot;</span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    &quot;author&quot;: &quot;任素汐&quot;,</span><br><span class="line">    &quot;lrc&quot;: &quot;http://127.0.0.1:7878/qqmusic/lrc/001D51640M6ZeR.lrc&quot;,</span><br><span class="line">    &quot;music_id&quot;: &quot;001D51640M6ZeR&quot;,</span><br><span class="line">    &quot;pic&quot;: &quot;https://y.qq.com/music/photo_new/T002R300x300M00000003uSK0ttEuV.jpg&quot;,</span><br><span class="line">    &quot;title&quot;: &quot;王招君 (你看你拉住我的模样)&quot;,</span><br><span class="line">    &quot;url&quot;: &quot;http://127.0.0.1:7878/qqmusic/001D51640M6ZeR&quot;</span><br><span class="line">  &#125;,</span><br><span class="line">  &#123;</span><br><span class="line">    &quot;author&quot;: &quot;杨宗纬&amp;宝石Gem&amp;王宇宙Leto&quot;,</span><br><span class="line">    &quot;lrc&quot;: &quot;http://127.0.0.1:7878/kuwo/lrc/377413145.lrc&quot;,</span><br><span class="line">    &quot;music_id&quot;: &quot;377413145&quot;,</span><br><span class="line">    &quot;pic&quot;: &quot;https://img2.kuwo.cn/star/albumcover/500/s3s52/26/4134677797.png&quot;,</span><br><span class="line">    &quot;title&quot;: &quot;若月亮没来(Live)&quot;,</span><br><span class="line">    &quot;url&quot;: &quot;http://127.0.0.1:7878/kuwo/377413145&quot;</span><br><span class="line">  &#125;</span><br><span class="line">]</span><br></pre></td></tr></table></figure><div class="table-container"><table><thead><tr><th>参数名</th><th>参数类型</th><th>参数描述</th></tr></thead><tbody><tr><td>author</td><td>string</td><td>作者</td></tr><tr><td>lrc</td><td>string</td><td>歌词地址（待解析）</td></tr><tr><td>pic</td><td>string</td><td>歌曲封面</td></tr><tr><td>title</td><td>string</td><td>歌曲名</td></tr><tr><td>url</td><td>string</td><td>歌曲地址（待解析）</td></tr><tr><td>music_id</td><td>string</td><td>音乐ID</td></tr></tbody></table></div><h1 id="声明"><a href="#声明" class="headerlink" title="声明"></a>声明</h1><ul><li><strong>本源码仅限用于学习交流，请勿用于商业用途，非法使用与作者无关</strong></li><li>如有侵权请联系我删除</li><li>学习交流QQ群：816017833</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;做这个的初衷就是&lt;a href=&quot;https://github.com/metowolf/Meting&quot;&gt;Meting&lt;/a&gt;这</summary>
      
    
    
    
    <category term="aplayer" scheme="https://www.app966.cn/categories/aplayer/"/>
    
    
    <category term="python" scheme="https://www.app966.cn/tags/python/"/>
    
    <category term="aplayer" scheme="https://www.app966.cn/tags/aplayer/"/>
    
    <category term="教程" scheme="https://www.app966.cn/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>butterfly切换夜间模式更换背景</title>
    <link href="https://www.app966.cn/post/26fa8bad.html"/>
    <id>https://www.app966.cn/post/26fa8bad.html</id>
    <published>2022-12-01T04:14:30.000Z</published>
    <updated>2023-01-26T12:46:36.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><ol><li>非常简单只需自定义css即可</li><li>本博客使用的是<code>butterfly4.2.2</code>版本</li></ol><h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><ol><li>在<code>/themes/butterfly/_config.yml</code>文件中设置一个默认背景</li><li>这里等于是白色背景，因为要设置黑夜背景切换默认背景图片如果不改成<code>url(&#39;&#39;)</code>后面设置的图片将不成功，具体原因没有研究<figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">background:</span> <span class="string">url(&#x27;&#x27;)</span></span><br></pre></td></tr></table></figure></li><li>在<code>/themes/butterfly/source/css/app966.css</code>文件中自定义css文件<figure class="highlight css"><table><tr><td class="code"><pre><span class="line"><span class="comment">/* 这里是设置一个全局透明度，不然不太协调，可以根据自己的喜好修改 */</span></span><br><span class="line"><span class="selector-pseudo">:root</span> &#123;</span><br><span class="line">    <span class="attr">--card-bg</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.3</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&#x27;dark&#x27;</span>]</span> <span class="selector-id">#web_bg</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">url</span>(<span class="string">&#x27;https://qcloud.app966.cn/img/wallpaper/pc/background.jpg&#x27;</span>);</span><br><span class="line">  <span class="attribute">background-size</span>: cover;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 适配手机模式 */</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-width</span>: <span class="number">768px</span>) &#123;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&#x27;dark&#x27;</span>]</span> <span class="selector-id">#web_bg</span> &#123;</span><br><span class="line">    <span class="attribute">background</span>: <span class="built_in">url</span>(<span class="string">&#x27;https://qcloud.app966.cn/img/wallpaper/mobile/background_phone.jpg&#x27;</span>);</span><br><span class="line">    <span class="attribute">background-size</span>: cover;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li>css中的图片链接可以修改成你们自己的哈，也可以在<a href="/picture/">我的相册</a>下载电脑和手机版的图片</li><li>最后要在头部引入你自定义的css，在<code>/themes/butterfly/_config.yml</code>文件中添加如下代码<figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/css/app966.css&quot;&gt;</span></span><br></pre></td></tr></table></figure><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1></li></ol><ul><li>到这里就结束啦，非常的简单非常的好看</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;非常简单只需自定义css即可&lt;/li&gt;
&lt;li&gt;本博客使用的是&lt;code&gt;butterfly4.2.2&lt;/code&gt;版本&lt;/li</summary>
      
    
    
    
    <category term="Butterfly" scheme="https://www.app966.cn/categories/Butterfly/"/>
    
    
    <category term="Butterfly" scheme="https://www.app966.cn/tags/Butterfly/"/>
    
    <category term="教程" scheme="https://www.app966.cn/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>aplayer魔改</title>
    <link href="https://www.app966.cn/post/a26d3af5.html"/>
    <id>https://www.app966.cn/post/a26d3af5.html</id>
    <published>2022-11-20T06:33:10.000Z</published>
    <updated>2023-06-26T09:53:07.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="解决痛点"><a href="#解决痛点" class="headerlink" title="解决痛点"></a>解决痛点</h1><ol><li>越来越多想听的歌曲因为收费无法收听</li><li>有些歌曲只在网易云，又有些只在企鹅系才有</li><li>我的魔改是播放器功能扩充，并非美化</li></ol><h1 id="解决思路"><a href="#解决思路" class="headerlink" title="解决思路"></a>解决思路</h1><ol><li>不管它套多少层我们只看官方怎么调用播放的</li><li>然后自己添加歌曲进去播放</li><li>歌曲是调自己的（下载后保存在oss），但是歌词啥的那肯定用现成了，所以这里要拼接内容</li><li>实际也可以不自己下载，在点击播放的时候我们再去取音乐的源地址也行，但是这个有个弊端，首先这个取收费歌曲的接口肯定迟早被封，被封后你得拥有一个vip的账号并且保持在线，一旦掉线你的播放器肯定就废了，所以我建议自定义添加的收费歌曲最好自己下载保存。</li></ol><h1 id="部署步骤"><a href="#部署步骤" class="headerlink" title="部署步骤"></a>部署步骤</h1><ul><li>首先创建一个歌单页面，使用<code>hexo new page 页面名</code>创建</li><li>在建好的页面中填入以下html代码<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;aplayer-wrap&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;aplayer1&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">button</span> <span class="attr">class</span>=<span class="string">&quot;docute-button load&quot;</span> <span class="attr">id</span>=<span class="string">&quot;kg&quot;</span> <span class="attr">onclick</span>=<span class="string">&quot;aplayer1()&quot;</span>&gt;</span>酷狗歌单<span class="tag">&lt;/<span class="name">button</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;aplayer2&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">button</span> <span class="attr">class</span>=<span class="string">&quot;docute-button load&quot;</span> <span class="attr">id</span>=<span class="string">&quot;wyy&quot;</span> <span class="attr">onclick</span>=<span class="string">&quot;aplayer2()&quot;</span>&gt;</span>网易云歌单<span class="tag">&lt;/<span class="name">button</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;aplayer3&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">button</span> <span class="attr">class</span>=<span class="string">&quot;docute-button load&quot;</span> <span class="attr">id</span>=<span class="string">&quot;qq&quot;</span> <span class="attr">onclick</span>=<span class="string">&quot;aplayer3()&quot;</span>&gt;</span>QQ歌单<span class="tag">&lt;/<span class="name">button</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">hr</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;aplayer4&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">button</span> <span class="attr">style</span>=<span class="string">&quot;display: block&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">button</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li>在<code>/butterfly/source/css</code>下新建一个css文件，内容如下<figure class="highlight css"><table><tr><td class="code"><pre><span class="line"><span class="selector-class">.docute-button</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#000</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.docute-button</span> &#123;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">2px</span> solid <span class="number">#000</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#000</span>;</span><br><span class="line">    <span class="attribute">cursor</span>: pointer;</span><br><span class="line">    <span class="attribute">outline</span>: none;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">33px</span>;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">5px</span> <span class="number">18px</span>;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">13px</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>: <span class="number">700</span>;</span><br><span class="line">    <span class="attribute">transition</span>: background-color .<span class="number">3s</span> ease;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 适配黑夜模式 */</span></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&#x27;dark&#x27;</span>]</span> <span class="selector-class">.docute-button</span><span class="selector-pseudo">:hover</span>&#123;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#000</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#fff</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&#x27;dark&#x27;</span>]</span> <span class="selector-class">.docute-button</span> &#123;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">2px</span> solid <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#000</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#fff</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.aplayer-wrap</span> &#123;</span><br><span class="line"><span class="attribute">display</span>: flex;</span><br><span class="line"><span class="attribute">justify-content</span>: space-between;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>在<code>/butterfly/source/js</code>下新建一个js文件，内容如下<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">aplayer1</span> () &#123;</span><br><span class="line"><span class="keyword">var</span> aplayer3 = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;qq&#x27;</span>);</span><br><span class="line">aplayer3.<span class="property">disabled</span> = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">var</span> aplayer2 = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;wyy&#x27;</span>);</span><br><span class="line">aplayer2.<span class="property">disabled</span> = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">var</span> aplayer1 = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;kg&#x27;</span>);</span><br><span class="line">aplayer1.<span class="property">disabled</span> = <span class="literal">true</span>;</span><br><span class="line"><span class="comment">/* 如何获取酷狗歌单id？首先需要设置可见，然后打开抓包工具，随便添加一首歌曲到歌单</span></span><br><span class="line"><span class="comment"> *  https://gateway.kugou.com/v4/add_song? 找到这个接口，在返回文本中找到specalidpgc即可</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="comment">/* 填写自己的id哦 */</span></span><br><span class="line"><span class="keyword">var</span> old_data = <span class="title function_">get_music</span>(<span class="string">&#x27;kugou&#x27;</span>, <span class="string">&#x27;6222311&#x27;</span>);</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">window</span>.<span class="property">ap</span> = <span class="keyword">new</span> <span class="title class_">APlayer</span>(&#123;</span><br><span class="line">        <span class="attr">container</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;aplayer4&#x27;</span>),</span><br><span class="line">        <span class="attr">mini</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="attr">autoplay</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="attr">loop</span>: <span class="string">&#x27;all&#x27;</span>,</span><br><span class="line">        <span class="attr">order</span>: <span class="string">&#x27;list&#x27;</span>,</span><br><span class="line">        <span class="attr">preload</span>: <span class="string">&#x27;none&#x27;</span>,</span><br><span class="line">        <span class="attr">volume</span>: <span class="number">1</span>,</span><br><span class="line">        <span class="attr">mutex</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="attr">listFolded</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="attr">listMaxHeight</span>: <span class="number">600</span>,</span><br><span class="line">        <span class="attr">lrcType</span>: <span class="number">3</span>,</span><br><span class="line">        <span class="attr">audio</span>: old_data</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">aplayer2</span> () &#123;</span><br><span class="line"><span class="keyword">var</span> aplayer3 = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;qq&#x27;</span>);</span><br><span class="line">aplayer3.<span class="property">disabled</span> = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">var</span> aplayer2 = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;wyy&#x27;</span>);</span><br><span class="line">aplayer2.<span class="property">disabled</span> = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">var</span> aplayer1 = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;kg&#x27;</span>);</span><br><span class="line">aplayer1.<span class="property">disabled</span> = <span class="literal">false</span>;</span><br><span class="line"><span class="comment">/* 填写自己的id哦 */</span></span><br><span class="line"><span class="keyword">var</span> old_data = <span class="title function_">get_music</span>(<span class="string">&#x27;netease&#x27;</span>, <span class="string">&#x27;7480897649&#x27;</span>);</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">window</span>.<span class="property">ap</span> = <span class="keyword">new</span> <span class="title class_">APlayer</span>(&#123;</span><br><span class="line">        <span class="attr">container</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;aplayer4&#x27;</span>),</span><br><span class="line">        <span class="attr">mini</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="attr">autoplay</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="attr">loop</span>: <span class="string">&#x27;all&#x27;</span>,</span><br><span class="line">        <span class="attr">order</span>: <span class="string">&#x27;list&#x27;</span>,</span><br><span class="line">        <span class="attr">preload</span>: <span class="string">&#x27;none&#x27;</span>,</span><br><span class="line">        <span class="attr">volume</span>: <span class="number">1</span>,</span><br><span class="line">        <span class="attr">mutex</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="attr">listFolded</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="attr">listMaxHeight</span>: <span class="number">600</span>,</span><br><span class="line">        <span class="attr">lrcType</span>: <span class="number">3</span>,</span><br><span class="line">        <span class="attr">audio</span>: old_data</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">aplayer3</span> () &#123;</span><br><span class="line">    <span class="keyword">var</span> aplayer3 = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;qq&#x27;</span>);</span><br><span class="line">aplayer3.<span class="property">disabled</span> = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">var</span> aplayer2 = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;wyy&#x27;</span>);</span><br><span class="line">aplayer2.<span class="property">disabled</span> = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">var</span> aplayer1 = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;kg&#x27;</span>);</span><br><span class="line">aplayer1.<span class="property">disabled</span> = <span class="literal">false</span>;</span><br><span class="line"><span class="comment">/* 填写自己的id哦 */</span></span><br><span class="line"><span class="keyword">var</span> old_data = <span class="title function_">get_music</span>(<span class="string">&#x27;tencent&#x27;</span>, <span class="string">&#x27;8672698451&#x27;</span>);</span><br><span class="line"><span class="keyword">var</span> new_data = <span class="title function_">get_music_json</span>();</span><br><span class="line">    <span class="keyword">var</span> n_data = <span class="title function_">add_music</span>(old_data, new_data);</span><br><span class="line">    <span class="variable language_">window</span>.<span class="property">ap</span> = <span class="keyword">new</span> <span class="title class_">APlayer</span>(&#123;</span><br><span class="line">        <span class="attr">container</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;aplayer4&#x27;</span>),</span><br><span class="line">        <span class="attr">mini</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="attr">autoplay</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="attr">loop</span>: <span class="string">&#x27;all&#x27;</span>,</span><br><span class="line">        <span class="attr">order</span>: <span class="string">&#x27;list&#x27;</span>,</span><br><span class="line">        <span class="attr">preload</span>: <span class="string">&#x27;none&#x27;</span>,</span><br><span class="line">        <span class="attr">volume</span>: <span class="number">1</span>,</span><br><span class="line">        <span class="attr">mutex</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="attr">listFolded</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="attr">listMaxHeight</span>: <span class="number">600</span>,</span><br><span class="line">        <span class="attr">lrcType</span>: <span class="number">3</span>,</span><br><span class="line">        <span class="attr">audio</span>: n_data</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">get_music_json</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">/* 获取自定义音乐列表 */</span></span><br><span class="line">    <span class="comment">/* 这里url填写自己自定义的歌曲，格式可以参考add_music()里面的注释 */</span></span><br><span class="line">    <span class="keyword">var</span> url = <span class="string">&#x27;https://qcloud.app966.cn/music_json/music_json.txt&#x27;</span>;</span><br><span class="line">    <span class="keyword">var</span> xhr = <span class="keyword">new</span> <span class="title class_">XMLHttpRequest</span>();</span><br><span class="line">    xhr.<span class="title function_">open</span>(<span class="string">&#x27;GET&#x27;</span>, url, <span class="literal">false</span>);</span><br><span class="line">    xhr.<span class="title function_">send</span>(<span class="literal">null</span>);</span><br><span class="line">    <span class="keyword">var</span> data = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(xhr.<span class="property">responseText</span>);</span><br><span class="line">    <span class="keyword">return</span> data;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">get_music</span>(<span class="params">server, id</span>) &#123;</span><br><span class="line">    <span class="comment">/* 获取音乐列表，只支持列表 */</span></span><br><span class="line">    <span class="keyword">var</span> url = <span class="string">&#x27;https://api.i-meto.com/meting/api?server=&#x27;</span> + server + <span class="string">&#x27;&amp;type=playlist&amp;id=&#x27;</span> + id;</span><br><span class="line">    <span class="keyword">var</span> xhr = <span class="keyword">new</span> <span class="title class_">XMLHttpRequest</span>();</span><br><span class="line">    xhr.<span class="title function_">open</span>(<span class="string">&#x27;GET&#x27;</span>, url, <span class="literal">false</span>);</span><br><span class="line">    xhr.<span class="title function_">send</span>(<span class="literal">null</span>);</span><br><span class="line">    <span class="keyword">var</span> obj = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(xhr.<span class="property">responseText</span>);</span><br><span class="line">    <span class="keyword">var</span> music_list = &#123;&#125;;</span><br><span class="line">    <span class="keyword">var</span> data = [];</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; obj.<span class="property">length</span>; i++) &#123;</span><br><span class="line">        music_list = &#123;</span><br><span class="line">            <span class="string">&#x27;name&#x27;</span>: obj[i].<span class="property">title</span>,</span><br><span class="line">            <span class="string">&#x27;artist&#x27;</span>: obj[i].<span class="property">author</span>,</span><br><span class="line">            <span class="string">&#x27;url&#x27;</span>: obj[i].<span class="property">url</span>,</span><br><span class="line">            <span class="string">&#x27;cover&#x27;</span>: obj[i].<span class="property">pic</span>,</span><br><span class="line">            <span class="string">&#x27;lrc&#x27;</span>: obj[i].<span class="property">lrc</span>,</span><br><span class="line">            <span class="string">&#x27;theme&#x27;</span>: <span class="string">&#x27;#ad7a86&#x27;</span></span><br><span class="line">        &#125;;</span><br><span class="line">        data.<span class="title function_">push</span>(music_list);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> data;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">add_music</span>(<span class="params">old_data, new_data</span>) &#123;</span><br><span class="line">    <span class="comment">/* 自定义添加自己喜欢的音乐，如周杰伦的收费音乐 */</span></span><br><span class="line">    <span class="comment">/*    new_data =  [</span></span><br><span class="line"><span class="comment">            &#123;</span></span><br><span class="line"><span class="comment">                &quot;name&quot;: &quot;最伟大的作品&quot;,</span></span><br><span class="line"><span class="comment">                &quot;artist&quot;: &quot;周杰伦&quot;,</span></span><br><span class="line"><span class="comment">                &quot;url&quot;: &quot;https://qcloud.app966.cn/music/最伟大的作品.mp3&quot;,</span></span><br><span class="line"><span class="comment">                &quot;cover&quot;: &quot;https://api.i-meto.com/meting/api?server=tencent&amp;type=pic&amp;id=0024bjiL2aocxT&amp;auth=61e9f0faa8848fad7dcaf1896547cfc1d67530fe&quot;,</span></span><br><span class="line"><span class="comment">                &quot;lrc&quot;: &quot;https://api.i-meto.com/meting/api?server=tencent&amp;type=lrc&amp;id=003KtYhg4frNXC&amp;auth=c25076612a8e246d85488dcfc4540cbef83d72b8&quot;,</span></span><br><span class="line"><span class="comment">                &quot;theme&quot;: &quot;#ad7a86&quot;</span></span><br><span class="line"><span class="comment">            &#125;</span></span><br><span class="line"><span class="comment">        ] */</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (new_data.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; new_data.<span class="property">length</span>; i++) &#123;</span><br><span class="line">            old_data.<span class="title function_">unshift</span>(new_data[i]);</span><br><span class="line">        &#125;;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">return</span> old_data;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">whenDOMReady</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (location.<span class="property">pathname</span> == <span class="string">&quot;/music/&quot;</span> || location.<span class="property">pathname</span> == <span class="string">&quot;/music/index.html&quot;</span>) &#123;</span><br><span class="line">        <span class="title function_">aplayer3</span>();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">whenDOMReady</span>();</span><br></pre></td></tr></table></figure></li></ul><h1 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h1><ol><li>以上都解决后基本就结束了，歌单列表替换成你们自己的就行了</li><li>我的设置了防盗链，不修改成你们的是无法使用的</li><li>如果报错就运行以下命令：<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line">npm install aplayer --save</span><br></pre></td></tr></table></figure></li><li>需要在<code>/butterfly/_config.yml</code>下引入你新建的css、js<figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/css/自定义的css.css&quot;&gt;</span></span><br><span class="line">  <span class="attr">bottom:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">defer</span> <span class="string">data-pjax</span> <span class="string">src=&quot;/js/自定义的js.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li>如果设置<code>listMaxHeight</code>列表高度无效，在自定义的css中加入如下代码<figure class="highlight css"><table><tr><td class="code"><pre><span class="line"><span class="selector-class">.aplayer</span> <span class="selector-class">.aplayer-list</span> &#123;</span><br><span class="line">    <span class="attribute">max-height</span>: <span class="number">600px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.aplayer</span> <span class="selector-class">.aplayer-list</span> <span class="selector-tag">ol</span> &#123;</span><br><span class="line">    <span class="attribute">max-height</span>: <span class="number">600px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h1 id="继续"><a href="#继续" class="headerlink" title="继续"></a>继续</h1><ul><li>如果你也想跟我一样喜欢自定义歌曲的，请按照以下内容继续</li></ul><ol><li>首先通过它的接口去获取我们的歌单列表，直接浏览器访问以下链接就行<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">https://api.i-meto.com/meting/api?server=tencent&amp;type=playlist&amp;id=8672698451</span><br></pre></td></tr></table></figure></li><li>如果不知道接口的意思就<a href="https://github.com/MoePlayer/hexo-tag-aplayer/blob/master/docs/README-zh_cn.md">看这个文档</a>，其它的直接忽略，我们只看<code>server</code>和<code>type</code>的意思，id很好理解，<code>type</code>是啥id就是啥id咯</li><li>访问后把结果赋值给下面<code>set_music()</code>中的<code>arr</code>，然后把运行后的结果赋值给<code>add_music()</code>的<code>new_data</code>，默认是把自己添加在置在最前<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">set_music</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">/* 转换 */</span></span><br><span class="line">    <span class="keyword">let</span> arr = [&#123;<span class="string">&quot;title&quot;</span>:<span class="string">&quot;去年夏天&quot;</span>,<span class="string">&quot;author&quot;</span>:<span class="string">&quot;王大毛&quot;</span>,<span class="string">&quot;url&quot;</span>:<span class="string">&quot;https://api.i-meto.com/meting/api?server=tencent&amp;type=url&amp;id=004XePmv4CsaEq&amp;auth=28f23251d1b3b2af8df8e03cf484acde79c6a429&quot;</span>,<span class="string">&quot;pic&quot;</span>:<span class="string">&quot;https://api.i-meto.com/meting/api?server=tencent&amp;type=pic&amp;id=003eyd0o3lYmxM&amp;auth=843fd0a3b54f4173c476275be999c3dba547dd36&quot;</span>,<span class="string">&quot;lrc&quot;</span>:<span class="string">&quot;https://api.i-meto.com/meting/api?server=tencent&amp;type=lrc&amp;id=004XePmv4CsaEq&amp;auth=9ce9221aaea8bea58474a5b6dcb329aef90b9319&quot;</span>&#125;];</span><br><span class="line">    <span class="keyword">var</span> music_list = &#123;&#125;;</span><br><span class="line">    <span class="keyword">var</span> data = [];</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; arr.<span class="property">length</span>; i++) &#123;</span><br><span class="line">        music_list = &#123;</span><br><span class="line">            <span class="string">&#x27;name&#x27;</span>: arr[i].<span class="property">title</span>,</span><br><span class="line">            <span class="string">&#x27;artist&#x27;</span>: arr[i].<span class="property">author</span>,</span><br><span class="line">            <span class="string">&#x27;url&#x27;</span>: <span class="string">&#x27;https://qcloud.app966.cn/music/&#x27;</span> + arr[i].<span class="property">title</span> + <span class="string">&#x27;.mp3&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;cover&#x27;</span>: arr[i].<span class="property">pic</span>,</span><br><span class="line">            <span class="string">&#x27;lrc&#x27;</span>: arr[i].<span class="property">lrc</span>,</span><br><span class="line">            <span class="string">&#x27;theme&#x27;</span>: <span class="string">&#x27;#ad7a86&#x27;</span></span><br><span class="line">        &#125;;</span><br><span class="line">        data.<span class="title function_">push</span>(music_list);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(data);</span><br><span class="line">    <span class="keyword">return</span> data;</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">set_music</span>();</span><br></pre></td></tr></table></figure></li></ol><ul><li><p>运行示例</p><div class="img-wrap"><div class="img-bg"><img class="img" src="https://qcloud.app966.cn/img/2.png"/></div></div></li><li><p>最后就是下载歌曲啦</p></li><li><p>运行下面的代码即可</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dow</span>():</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        music_name = <span class="built_in">input</span>(<span class="string">&#x27;\r请输入歌曲名：&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> music_name == <span class="string">&#x27;exit&#x27;</span>:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        header = &#123;<span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0&#x27;</span>&#125;</span><br><span class="line">        url = <span class="string">&#x27;http://search.kuwo.cn/r.s?client=kt&amp;all=&#x27;</span> + music_name + <span class="string">&#x27;&amp;pn=0&amp;rn=10&amp;ver=kwplayer_ar_99.99.99.99&amp;vipver=1&amp;ft=music&amp;cluster=0&amp;strategy=2012&amp;encoding=utf8&amp;rformat=json&amp;vermerge=1&amp;mobi=1&#x27;</span></span><br><span class="line">        ret = requests.get(url, headers=header, verify=<span class="literal">False</span>).json()</span><br><span class="line">        n = <span class="number">0</span></span><br><span class="line">        title = <span class="string">&#x27;&#x27;</span></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> ret[<span class="string">&#x27;abslist&#x27;</span>]:</span><br><span class="line">            n += <span class="number">1</span></span><br><span class="line">            title += <span class="built_in">str</span>(n) + <span class="string">&#x27;. &#x27;</span> + i[<span class="string">&#x27;SONGNAME&#x27;</span>] + <span class="string">&#x27; - &#x27;</span> + i[<span class="string">&#x27;ARTIST&#x27;</span>] + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">        <span class="built_in">print</span>(title)</span><br><span class="line">        rid = <span class="built_in">input</span>(<span class="string">&#x27;请输入序号下载对应的歌曲：&#x27;</span>)</span><br><span class="line">        x = <span class="built_in">int</span>(rid) - <span class="number">1</span></span><br><span class="line">        rid = ret[<span class="string">&#x27;abslist&#x27;</span>][x][<span class="string">&#x27;MUSICRID&#x27;</span>]</span><br><span class="line">        music_name = ret[<span class="string">&#x27;abslist&#x27;</span>][x][<span class="string">&#x27;SONGNAME&#x27;</span>]</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&#x27;-&#x27;</span> <span class="keyword">in</span> music_name:</span><br><span class="line">            music_name = str_left(music_name, <span class="string">&#x27;-&#x27;</span>)</span><br><span class="line">        <span class="built_in">print</span>(rid, music_name)</span><br><span class="line">        url = <span class="string">&#x27;http://antiserver.kuwo.cn/anti.s?response=url&amp;rid=&#x27;</span> + rid + <span class="string">&#x27;&amp;format=mp3|mp3&amp;type=convert_url&#x27;</span></span><br><span class="line">        play_url = requests.get(url, headers=header, verify=<span class="literal">False</span>).text</span><br><span class="line">        <span class="keyword">if</span> play_url:</span><br><span class="line">            downloader(play_url, music_name)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">downloader</span>(<span class="params">url, title</span>):</span><br><span class="line">    size = <span class="number">0</span></span><br><span class="line">    path = <span class="string">r&#x27;D:\\music\\&#x27;</span> + title + <span class="string">&#x27;.mp3&#x27;</span></span><br><span class="line">    res = requests.get(url, stream=<span class="literal">True</span>, verify=<span class="literal">False</span>)</span><br><span class="line">    chunk_size = <span class="number">1024</span></span><br><span class="line">    <span class="comment"># 每次下载数据大小</span></span><br><span class="line">    content_size = <span class="built_in">int</span>(res.headers[<span class="string">&quot;content-length&quot;</span>])</span><br><span class="line">    <span class="comment"># 总大小</span></span><br><span class="line">    <span class="keyword">if</span> res.status_code == <span class="number">200</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;[%s 文件大小]: %0.2f MB&#x27;</span> % (title, content_size / chunk_size / <span class="number">1024</span>))</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(path, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            <span class="keyword">for</span> data <span class="keyword">in</span> res.iter_content(chunk_size=chunk_size):</span><br><span class="line">                f.write(data)</span><br><span class="line">                size += <span class="built_in">len</span>(data)  <span class="comment"># 已下载文件大小</span></span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&#x27;\r&#x27;</span> + <span class="string">&#x27;[下载进度]: %s%.2f%%&#x27;</span> % (<span class="string">&#x27;&gt;&#x27;</span> * <span class="built_in">int</span>(size * <span class="number">50</span> / content_size), <span class="built_in">float</span>(size / content_size * <span class="number">100</span>)), end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">str_left</span>(<span class="params">t, s</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">isinstance</span>(t, <span class="built_in">str</span>) != <span class="literal">True</span> <span class="keyword">or</span> <span class="built_in">isinstance</span>(s, <span class="built_in">str</span>) != <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;传入参数有误&#x27;</span></span><br><span class="line">    <span class="keyword">elif</span> t.find(s) != -<span class="number">1</span>:</span><br><span class="line">        <span class="keyword">return</span> t[<span class="number">0</span>:t.find(s)]</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    dow()</span><br></pre></td></tr></table></figure></li><li>运行示例<div class="img-wrap"><div class="img-bg"><img class="img" src="https://qcloud.app966.cn/img/1.png"/></div></div></li><li>预览<a href="/music/">我的歌单</a>查看效果</li></ul><h1 id="删除meting-js"><a href="#删除meting-js" class="headerlink" title="删除meting_js"></a>删除meting_js</h1><ol><li>在hexo目录下执行<code>npm uninstall hexo-tag-aplayer</code></li><li>打开<code>/butterfly/scripts/events/config.js</code>文件，删除<code>meting_js</code><figure class="highlight diff"><table><tr><td class="code"><pre><span class="line">    aplayer_css: &#x27;https://cdn.jsdelivr.net/npm/aplayer@1/dist/APlayer.min.css&#x27;,</span><br><span class="line">    aplayer_js: &#x27;https://cdn.jsdelivr.net/npm/aplayer@1/dist/APlayer.min.js&#x27;,</span><br><span class="line"><span class="deletion">-   meting_js: &#x27;https://cdn.jsdelivr.net/gh/metowolf/MetingJS@1.2/dist/Meting.min.js&#x27;,</span></span><br><span class="line">    prismjs_js: &#x27;https://cdn.jsdelivr.net/npm/prismjs@1/prism.min.js&#x27;,</span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;解决痛点&quot;&gt;&lt;a href=&quot;#解决痛点&quot; class=&quot;headerlink&quot; title=&quot;解决痛点&quot;&gt;&lt;/a&gt;解决痛点&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;越来越多想听的歌曲因为收费无法收听&lt;/li&gt;
&lt;li&gt;有些歌曲只在网易云，又有些只在企鹅系才有&lt;/li&gt;
&lt;li</summary>
      
    
    
    
    <category term="python" scheme="https://www.app966.cn/categories/python/"/>
    
    
    <category term="python" scheme="https://www.app966.cn/tags/python/"/>
    
    <category term="node" scheme="https://www.app966.cn/tags/node/"/>
    
  </entry>
  
  <entry>
    <title>抖音自动上传视频</title>
    <link href="https://www.app966.cn/post/b8baec7.html"/>
    <id>https://www.app966.cn/post/b8baec7.html</id>
    <published>2022-11-07T08:01:25.000Z</published>
    <updated>2024-07-27T14:16:01.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="发布视频小程序V3-2"><a href="#发布视频小程序V3-2" class="headerlink" title="发布视频小程序V3.2"></a>发布视频小程序V3.2</h1><h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><ul><li><a href="https://github.com/Superheroff/douyin_uplod">douyin_uplod</a></li><li><a href="https://www.douyin.com/user/MS4wLjABAAAAQ5zADansJK87lob69mserrY7ZF5taykVB1paHgO8APhx7dFs_YDkbWhVFf2dznp9">请大家关注我的抖音</a></li></ul><h2 id="如何使用"><a href="#如何使用" class="headerlink" title="如何使用"></a>如何使用</h2><ol><li>把项目下载到本地</li><li>依次运行下面命令 <figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">git clone https://github.com/Superheroff/douyin_uplod.git</span><br><span class="line">pip install -r requirements.txt -i https://mirrors.bfsu.edu.cn/pypi/web/simple/</span><br><span class="line">playwright install chromium</span><br><span class="line">python main.py</span><br></pre></td></tr></table></figure></li></ol><ul><li><strong>注意①：只提供昵称的@并不准确，加抖音号才能完全准确</strong></li><li><strong>注意②：首次使用需要先运行<code>get_cookie.py</code>登录</strong></li></ul><h2 id="目录结构"><a href="#目录结构" class="headerlink" title="目录结构"></a>目录结构</h2><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">douyin_uplod V3</span><br><span class="line">│</span><br><span class="line">├── frames  # 存放视频抽帧的图片</span><br><span class="line">│     └── x.jpg # 图片</span><br><span class="line">├── video  # 视频目录</span><br><span class="line">│     └── x.mp4 # 未处理的视频</span><br><span class="line">│     └── x2.mp4 # 处理中未添加背景音乐的视频</span><br><span class="line">│     └── x3.mp4 # 处理完的视频（上传的是这个视频，上传未经处理的视频会被限流）</span><br><span class="line">├── music  # 背景音乐目录</span><br><span class="line">│     └── background.mp3 # 从视频中提取出来的音乐</span><br><span class="line">├── cookie  # 存放账号目录</span><br><span class="line">│     └── cookie_手机号.json # cookie</span><br><span class="line">├── main.py    # 主程序入口</span><br><span class="line">├── config.py  # 配置文件</span><br><span class="line">├── get_cookie.py  # 生成cookie.json文件</span><br><span class="line">├── logs.py  # 生成日志</span><br><span class="line">├── logs.log  # 日志</span><br><span class="line">├── video_id_list.txt  # 记录发过的视频ID，避免重复</span><br><span class="line">├── README.md</span><br><span class="line">└── requirements.txt # 依赖文件</span><br></pre></td></tr></table></figure><h2 id="更新内容"><a href="#更新内容" class="headerlink" title="更新内容"></a>更新内容</h2><p><strong>2024.06.27</strong></p><ul><li>修复视频下载</li></ul><p><strong>2024.06.25</strong></p><ul><li>修复登录</li></ul><p><strong>2024.04.06</strong></p><ul><li>本次更新不再依赖任何第三方api</li></ul><p><strong>2024.03.26</strong></p><ul><li>修复判断是否登录</li></ul><p><strong>2024.03.18</strong></p><ul><li>优化@人，解决对方改变昵称后@不成功的问题</li><li>新增配置自定义截取视频开头结尾帧数</li></ul><p><strong>2024.03.07</strong></p><ol><li>新增视频声明配置</li><li>新增视频定位开关配置</li><li>解决了一些问题</li></ol><p><strong>2024.03.04</strong></p><ol><li>修复文件路径问题</li><li>新增视频发布进度条</li><li>新增视频声明</li><li>先判断是否登录再处理视频，解决先处理视频后发现未登录的尴尬场景</li></ol><p><strong>2024.01.23</strong></p><ul><li>解决<code>get_cookie</code>无法获取cookie的问题</li></ul><p><strong>2024.01.17</strong></p><ul><li>修复BUG</li></ul><p><strong>2024.01.15</strong></p><ol><li>解决视频重复问题</li><li>新增单双号发布不同的话题内容</li></ol><p><strong>2024.01.12</strong></p><ol><li>优化@人</li><li>新增城市定位</li><li>新增普通认证号筛选</li><li>筛选优化，如全部未有符合条件的内容自动再次获取</li></ol><p><strong>2024.01.11</strong></p><ol><li>优化处理视频</li><li>新增筛选：去除图集视频、去除时长过短的视频</li><li>优化音乐榜采集，增加随机翻页减少重复视频</li></ol><h2 id="待优化"><a href="#待优化" class="headerlink" title="待优化"></a>待优化</h2><ul><li>识别擦边女，拒绝爬取擦边视频</li></ul><h2 id="运行逻辑"><a href="#运行逻辑" class="headerlink" title="运行逻辑"></a>运行逻辑</h2><ul><li>每隔1小时随机从抖音热门音乐中选择一首，从选择的音乐中随机提取一条视频，并抽掉前90帧和尾30帧后发布</li><li>如有侵权，请联系我删除！</li><li>联系方式：838210720</li></ul><h2 id="运行日志"><a href="#运行日志" class="headerlink" title="运行日志"></a>运行日志</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">正在使用[15579611112]发布作品，当前账号排序[1]</span><br><span class="line">正在判断账号是否登录</span><br><span class="line">账号已登录</span><br><span class="line">music_id: 7312850623345527603</span><br><span class="line">url: http://v3-web.douyinvod.com/e5be13cd66c2e99df4a5dc8d74a4bff4/65e4afcf/video/tos/cn/tos-cn-ve-15/ocwAH9yEbELzxBwIgKCLYthCfAAe3Q7Dyr9TGI/?a=6383&amp;ch=8&amp;cr=3&amp;dr=0&amp;lr=all&amp;cd=0%7C0%7C0%7C3&amp;cv=1&amp;br=1289&amp;bt=1289&amp;cs=0&amp;ds=4&amp;ft=bvTKJbQQqUiSf_TZyo0ORVTYA0pijkIrejKJsCAyx.0P3-I&amp;mime_type=video_mp4&amp;qs=0&amp;rc=ZjU1OjU8ZjhlNzU7ZDs8NUBpamU2azY6ZjhrcTMzNGkzM0A2NC80Y18yXjYxLTNgYWFhYSNpbjM2cjRfcWFgLS1kLS9zcw%3D%3D&amp;btag=e00018000&amp;cquery=100a&amp;dy_q=1709482393&amp;feature_id=46a7bb47b4fd1280f3d3825bf2b29388&amp;l=20240304001313B4854C73E6800D57BF70</span><br><span class="line">nickname: 黏苞米糊糊</span><br><span class="line">video_id: 7339494544162983204</span><br><span class="line">处理前md5： 4453555b2ac6c4b6c9d844d94d27301d</span><br><span class="line">正在处理视频</span><br><span class="line">视频抽帧进度: 100%|██████████| 1047/1047 [00:39&lt;00:00, 26.44it/s]</span><br><span class="line">图片合成进度: 100%|█████████▉| 1046/1047 [00:14&lt;00:00, 72.67it/s]</span><br><span class="line">开始添加背景音乐！</span><br><span class="line">MoviePy - Writing audio in music/background.mp3</span><br><span class="line">MoviePy - Done.</span><br><span class="line">Moviepy - Building video E:\python\douyin\发布小程序\video\#标题2 @1486323920 —来自：音乐榜单的第2个音乐《身骑白马 (pay姐版) 已全网上线》第13页第5个@黏苞米糊糊 的作品3.mp4.</span><br><span class="line">MoviePy - Writing audio in #标题2 @1486323920 —来自：音乐榜单的第2个音乐《身骑白马 (pay姐版) 已全网上线》第13页第5个@黏苞米糊糊 的作品3TEMP_MPY_wvf_snd.mp3</span><br><span class="line">t:   0%|          | 0/1047 [00:00&lt;?, ?it/s, now=None]MoviePy - Done.</span><br><span class="line">Moviepy - Writing video E:\python\douyin\发布小程序\video\#标题2 @1486323920 —来自：音乐榜单的第2个音乐《身骑白马 (pay姐版) 已全网上线》第13页第5个@黏苞米糊糊 的作品3.mp4</span><br><span class="line"></span><br><span class="line">t: 100%|█████████▉| 1046/1047 [00:25&lt;00:00, 43.60it/s, now=None][2024-03-04 00:14:57,566]-warnings.py-109-MainThread-E:\python\douyin\发布小程序\venv\Lib\site-packages\moviepy\video\io\ffmpeg_reader.py:123: UserWarning: Warning: in file E:\python\douyin\发布小程序\video\#标题2 @1486323920 —来自：音乐榜单的第2个音乐《身骑白马 (pay姐版) 已全网上线》第13页第5个@黏苞米糊糊 的作品2.mp4, 6220800 bytes wanted but 0 bytes read,at frame 1046/1047, at time 34.87/34.87 sec. Using the last valid frame instead.</span><br><span class="line">  warnings.warn(&quot;Warning: in file %s, &quot;%(self.filename)+</span><br><span class="line"></span><br><span class="line">Moviepy - Done !</span><br><span class="line">Moviepy - video ready E:\python\douyin\发布小程序\video\#标题2 @1486323920 —来自：音乐榜单的第2个音乐《身骑白马 (pay姐版) 已全网上线》第13页第5个@黏苞米糊糊 的作品3.mp4</span><br><span class="line">背景音乐添加完成！</span><br><span class="line">处理后md5： f97a9c8b2140a228142db443937f6b79</span><br><span class="line">视频处理完毕</span><br><span class="line">该视频有话题</span><br><span class="line">[2024-03-04 00:14:59,035]-main.py-450-MainThread-视频下载成功，等待发布</span><br><span class="line">Timeout 30000ms exceeded.</span><br><span class="line">正在添加第1个话题</span><br><span class="line">正在添加第1个想@的人</span><br><span class="line">[2024-03-04 00:15:37,533]-main.py-505-MainThread-@1486323920失败了，可能被对方拉黑了</span><br><span class="line">@1486323920失败了，可能被对方拉黑了</span><br><span class="line">正在添加第2个话题</span><br><span class="line">正在添加第3个话题</span><br><span class="line">正在添加第2个想@的人</span><br><span class="line">想@的人 黏苞米糊糊</span><br><span class="line">正在添加第4个话题</span><br><span class="line">视频标题输入完毕，等待发布</span><br><span class="line">位置添加成功</span><br><span class="line">[2024-03-04 00:15:51,116]-main.py-538-MainThread-账号发布视频成功</span><br><span class="line">[2024-03-04 00:15:51,205]-main.py-549-MainThread-账号发布视频成功</span><br><span class="line">来自网页的实时消息：发布成功</span><br><span class="line">账号发布视频成功</span><br></pre></td></tr></table></figure><h1 id="声明"><a href="#声明" class="headerlink" title="声明"></a>声明</h1><ul><li>qq交流群：816017833</li><li>有任何问题请到<a href="https://github.com/Superheroff/douyin_uplod/issues">issues</a>提交</li><li>本源码只是出于学习交流的目的，使用者造成的任何后果均与作者无关</li></ul>]]></content>
    
    
    <summary type="html">从0自动生成视频，解决你不知道发什么视频的烦恼。</summary>
    
    
    
    <category term="python" scheme="https://www.app966.cn/categories/python/"/>
    
    
    <category term="python" scheme="https://www.app966.cn/tags/python/"/>
    
    <category term="playwright" scheme="https://www.app966.cn/tags/playwright/"/>
    
  </entry>
  
  <entry>
    <title>快手did注册</title>
    <link href="https://www.app966.cn/post/5f69c3c3.html"/>
    <id>https://www.app966.cn/post/5f69c3c3.html</id>
    <published>2022-08-20T14:57:10.000Z</published>
    <updated>2023-01-26T12:46:36.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><ul><li>2022-8-20测试可用</li><li>网页版did</li><li>仅限用于学习交流</li><li>滥用导致的后果与作者无关</li></ul><h1 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h1><ul><li><strong>代码是易语言</strong></li><li><strong>思路</strong></li></ul><ol><li>访问快手官网获取返回的did</li><li>通过<code>/rest/wd/common/log/collect/misc2</code>注册</li><li>注册完需要访问一次用户主页才算成功</li></ol><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">.版本 2</span><br><span class="line">.支持库 spec</span><br><span class="line"></span><br><span class="line">.程序集 程序集1</span><br><span class="line">.程序集变量 cookie, 文本型</span><br><span class="line">.程序集变量 http, 类_POST数据类</span><br><span class="line">.程序集变量 ua, 文本型</span><br><span class="line">.程序集变量 did, 文本型</span><br><span class="line"></span><br><span class="line">.子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">_临时子程序 ()  &#x27; 在初始化代码执行完毕后调用测试代码</span><br><span class="line">返回 (0)  &#x27; 返回值被忽略。</span><br><span class="line"></span><br><span class="line">.子程序 _临时子程序</span><br><span class="line"></span><br><span class="line">&#x27; 本名称子程序用作测试程序用，仅在开发及调试环境中有效，编译发布程序前将被系统自动清空，请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。</span><br><span class="line">ua ＝ “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36”</span><br><span class="line">http.添加 (“content-type”, “application/json”)</span><br><span class="line">http.添加 (“User-Agent”, ua)</span><br><span class="line"></span><br><span class="line">获取did ()</span><br><span class="line">获取用户作品 ()</span><br><span class="line"></span><br><span class="line">.子程序 获取did, 逻辑型</span><br><span class="line">.局部变量 url, 文本型</span><br><span class="line">.局部变量 ret, 文本型</span><br><span class="line">.局部变量 data, 文本型</span><br><span class="line">.局部变量 json, 类_json</span><br><span class="line">.局部变量 re, 正则表达式类</span><br><span class="line">.局部变量 uid, 文本型</span><br><span class="line">.局部变量 name, 文本型</span><br><span class="line"></span><br><span class="line">url ＝ “https://live.kuaishou.com/cate/ZH/1000020”</span><br><span class="line">ret ＝ 编码_Utf8到Ansi (网页_访问_对象 (url, , , , cookie, “User-Agent: ” ＋ ua))</span><br><span class="line">re.创建 (#常量4, ret, , 真, 真)</span><br><span class="line">uid ＝ 文本_取左边 (re.取匹配文本 (1), “,” ＋ #引号 ＋ “LiveInfo:”)</span><br><span class="line">json.解析 (uid)</span><br><span class="line">uid ＝ 文本_取右边 (json.取通用属性 (“user.id”), “User:”)</span><br><span class="line">re.创建 (#常量5, ret, , 真, 真)</span><br><span class="line">name ＝ 文本_取出中间文本 (re.取匹配文本 (1), #引号 ＋ “name” ＋ #引号 ＋ “:” ＋ #引号, #引号)</span><br><span class="line">did ＝ 网页_取单条Cookie (cookie, “did”, 真)</span><br><span class="line">调试输出 (did, uid, name)</span><br><span class="line">url ＝ “https://log-sdk.ksapisrv.com/rest/wd/common/log/collect/misc2?v=3.9.49&amp;kpn=KS_GAME_LIVE_PC”</span><br><span class="line">data ＝ 子文本替换 (#常量2, “[did]”, did, , , 真)</span><br><span class="line">data ＝ 子文本替换 (data, “[ts]”, 时间_取现行时间戳 (), , , 真)</span><br><span class="line">data ＝ 子文本替换 (data, “[tss]”, 文本_取随机范围数字 (1000, 9999), , , 真)</span><br><span class="line">ret ＝ 编码_Utf8到Ansi (网页_访问_对象 (url, 1, data, cookie, , http.获取协议头数据 ()))</span><br><span class="line">json.解析 (ret)</span><br><span class="line"></span><br><span class="line">.如果真 (uid ＝ “” 或 name ＝ “”)</span><br><span class="line">    返回 (假)</span><br><span class="line">.如果真结束</span><br><span class="line">.判断开始 (json.取通用属性 (“result”) ＝ “1”)</span><br><span class="line">    url ＝ “https://live.kuaishou.com/u/” ＋ uid</span><br><span class="line">    ret ＝ 编码_Utf8到Ansi (网页_访问_对象 (url, , , cookie, , http.获取协议头数据 ()))</span><br><span class="line">    .判断开始 (寻找文本 (ret, name, , 假) ≠ -1)</span><br><span class="line">        返回 (真)</span><br><span class="line">    .默认</span><br><span class="line">        返回 (假)</span><br><span class="line">    .判断结束</span><br><span class="line"></span><br><span class="line">.默认</span><br><span class="line">    返回 (假)</span><br><span class="line">.判断结束</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">.子程序 获取用户作品</span><br><span class="line">.参数 uid, 文本型, 可空</span><br><span class="line">.局部变量 url, 文本型</span><br><span class="line">.局部变量 ret, 文本型</span><br><span class="line">.局部变量 data, 文本型</span><br><span class="line"></span><br><span class="line">.如果真 (uid ＝ “”)</span><br><span class="line">    uid ＝ “3x9d8g28wd78xs2”</span><br><span class="line">.如果真结束</span><br><span class="line"></span><br><span class="line">url ＝ “https://www.kuaishou.com/graphql”</span><br><span class="line">http.添加 (“Referer”, “https://www.kuaishou.com/profile/” ＋ uid)</span><br><span class="line">http.添加 (“Origin”, “https://www.kuaishou.com”)</span><br><span class="line">http.添加 (“Host”, “www.kuaishou.com”)</span><br><span class="line">http.添加 (“sec-ch-ua”, #常量6)</span><br><span class="line">http.添加 (“sec-ch-ua-mobile”, “?0”)</span><br><span class="line">http.添加 (“sec-ch-ua-platform”, #引号 ＋ “Windows” ＋ #引号)</span><br><span class="line">http.添加 (“Sec-Fetch-Dest”, “empty”)</span><br><span class="line">http.添加 (“Sec-Fetch-Mode”, “cors”)</span><br><span class="line">http.添加 (“Sec-Fetch-Site”, “same-origin”)</span><br><span class="line">data ＝ 子文本替换 (#常量3, “[uid]”, uid, , , 真)</span><br><span class="line">ret ＝ 编码_Utf8到Ansi (网页_访问_对象 (url, 1, data, “Cookie: kpf=PC_WEB; kpn=KUAISHOU_VISION; ksliveShowClipTip=true; clientid=3; did=” ＋ did ＋ “; client_key=65890b29”, , http.获取协议头数据 ()))</span><br><span class="line">调试输出 (ret)</span><br><span class="line">置剪辑板文本 (ret)</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="下载e源码"><a href="#下载e源码" class="headerlink" title="下载e源码"></a>下载e源码</h1><ul><li><a href="/temp/kuaishou.e">kuaishou.e</a></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;2022-8-20测试可用&lt;/li&gt;
&lt;li&gt;网页版did&lt;/li&gt;
&lt;li&gt;仅限用于学习交流&lt;/li&gt;
&lt;li&gt;滥用导致的后果</summary>
      
    
    
    
    <category term="易语言" scheme="https://www.app966.cn/categories/%E6%98%93%E8%AF%AD%E8%A8%80/"/>
    
    
    <category term="易语言" scheme="https://www.app966.cn/tags/%E6%98%93%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>浅谈一下如何应对ddos攻击和软件破解</title>
    <link href="https://www.app966.cn/post/e3a0a7a2.html"/>
    <id>https://www.app966.cn/post/e3a0a7a2.html</id>
    <published>2022-08-13T08:34:21.000Z</published>
    <updated>2023-01-26T12:46:36.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><ol><li>ddos攻击和软件破解我经历了太多了</li><li>近期闲下来想了很多，如果想彻底解决被破解的烦恼不能只从前端去解决，因为这样是治标不治本的，<code>Adobe、Jetbrains</code>这种大公司的软件都能被破解还解不了你吗？</li></ol><h1 id="解决思路"><a href="#解决思路" class="headerlink" title="解决思路"></a>解决思路</h1><h2 id="后端防破解"><a href="#后端防破解" class="headerlink" title="后端防破解"></a>后端防破解</h2><ul><li><strong>下面是我的后端处理思路</strong></li></ul><ol><li>我们的软件分为前端和后端，前端是<code>用户接触和操作</code>的部分，后端是给前端<code>提供服务</code>的部分，我们要严格区分前后端的功能，不能把实际功能写在前端，而是通过调用后端来返回</li><li>前端<code>只负责展示</code>内容和用户登录注册，其它的事一律不做</li><li>然后用户登录后我们把他的id返回给后端告诉后端这个人已经登录了，现在我们开始对他进行校验，他每次点击前端的某个重要功能都从后端获取一次他的是否到期的<code>状态</code>，后端每60秒（或者其他时间根据实际情况来）校验一次他的到期时间并把是否到期的结果存入redis中，做一个接口从redis返回这个结果给到前端，这样解决频繁调用的问题，后端要做计划任务，60秒或者多少秒根据你的实际需求来，可以一直做计划任务，因为你不可能就一个用户这个用户下线另一个用户还在呢；如何校验？用redis的集合呗，<code>只校验到期的那个集合里是否有他就行了</code>，有他那我们后端直接给前端返回空，等于直接<code>罢工</code>了，反之正常运行。</li><li>我这到期时间只是一种例子，你可以根据实际情况来，比如用<code>cookie、token</code>校验登录状态，破解者肯定是破解掉你的登录，用户名也是随便输入的你数据库可能都<code>没有这个用户</code>，<code>登录状态不在线的情况下我们就罢工</code>，你的接口也要去<code>校验时间戳</code>，数据传输最好做个<code>加密</code>，以免破解者发送<code>旧包</code>蒙混过关</li></ol><h2 id="前端防破解"><a href="#前端防破解" class="headerlink" title="前端防破解"></a>前端防破解</h2><ul><li><strong>下面是我的前端处理思路</strong></li></ul><ol><li>检验启动文件的<code>md5 crc32 以及文件体积</code></li><li>检测<code>od</code>等调试工具</li><li>关键代码处不要有任何<code>信息提示</code>，不要有如果和判断，用<code>循环</code>，循环次数无所谓啊，你反正在执行完代码的尾处直接写个<code>跳出</code>就行</li><li><code>时间</code>检测，检测初始化代码的运行时间，如果<code>时间太长</code>肯定有问题，我们直接给他结束</li><li>设置<code>暗桩</code>，比如你明检测到被破解了，但是你不说，等到运行主程序的时候某些功能无法使用啊或者少内容等，注意：全程<code>不要输出任何提示</code>，让某些功能失效时直接就失效，不要有提示，不要信息框，不要打印输出</li><li>使用<code>多种不同的语言</code>写代码，比如我时间检测用java，检测od用易语言，检测md5用python等</li><li>混淆代码。易语言可以在<code>工具</code>-<code>系统配置</code>-<code>安全</code>-<code>设置花指令</code>-<code>设置指令打乱</code></li></ol><h1 id="防ddos攻击"><a href="#防ddos攻击" class="headerlink" title="防ddos攻击"></a>防ddos攻击</h1><ul><li><strong>首先这是个费钱的活，你肯定得增加服务器</strong></li></ul><ol><li>流量小用nginx做个简单的<code>负载均衡</code>即可解决</li><li>一定<code>要用CDN</code>，为什么呢？把自己的<code>真实IP隐藏</code>起来才是真的，这样我把子域名一改嘿嘿我又活了</li><li>拉黑一些<code>恶意IP</code>，禁止<code>境外IP</code>访问，因为ddos大部分都是境外的IP攻击</li><li>流量大最好是用nacos + spring cloud alibaba【涉及到的知识有java、docker、spring cloud、linux】</li><li>如何区分流量大小，每秒<code>1W以上</code>并发进来的算是比较大了</li><li>实在抗不住把你<code>挂掉的机器</code>也加入到集群中，这样总不至于整个垮掉，起到一个<code>雪崩保护</code>的作用</li></ol><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><ul><li>有更好的思路可以留言<code>一起探讨</code></li><li>以上是我的<code>全部解决思路</code>，希望对你有所帮助吧</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;ddos攻击和软件破解我经历了太多了&lt;/li&gt;
&lt;li&gt;近期闲下来想了很多，如果想彻底解决被破解的烦恼不能只从前端去解决，因为这</summary>
      
    
    
    
    <category term="软件安全" scheme="https://www.app966.cn/categories/%E8%BD%AF%E4%BB%B6%E5%AE%89%E5%85%A8/"/>
    
    
    <category term="软件安全" scheme="https://www.app966.cn/tags/%E8%BD%AF%E4%BB%B6%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>Butterfly友链检查、友链朋友圈开发</title>
    <link href="https://www.app966.cn/post/ef63b2d7.html"/>
    <id>https://www.app966.cn/post/ef63b2d7.html</id>
    <published>2022-08-11T07:13:53.000Z</published>
    <updated>2023-01-26T12:46:36.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><ul><li>Q: 已经有成熟可用的<a href="https://fcircle-doc.js.cool/">相关项目</a>了为啥还要做一个呢？</li><li>A：一切都是为了摸鱼。主要为了打发时间加练练手，另外他的源码我也看了，是不错的；我不在他的上面做继承，我只做Butterfly主题的适配；</li><li>A：整个项目大致逻辑通过每日计划任务[x,x1,x2]时获取朋友的一篇最新文章并存入redis中间件中以供前端调用，第二天自动清除，不保存历史数据。</li><li>Q：为啥要使用redis这个项目的场景调用量并不多？</li><li>A：主要是因为我想熟悉下redis好久没有使用了，而且redis确实适合这种场景下，轻便速度也快，最主要没有存数据的需求，随取随丢。</li></ul><h1 id="当前进度"><a href="#当前进度" class="headerlink" title="当前进度"></a>当前进度</h1><div class="timeline green"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>2022</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>08-20</p></div></div><div class='timeline-item-content'><ol><li>已完善友链检查</li><li>新增获取友链的最新/随机文章为后面的友链朋友圈做铺垫</li></ol></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>08-10</p></div></div><div class='timeline-item-content'><ul><li>完成了友链检查雏形</li></ul></div></div></div><h1 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h1><details class="folding-tag" cyan open><summary> 主文件代码 </summary>              <div class='content'>              <ul><li>由于某些原因，例如没有匹配到头像等问题，已经做了异常处理，再次获取头像等待下次更新</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/8/8 11:04</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : get_friends.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> asyncio</span><br><span class="line"><span class="keyword">from</span> playwright.async_api <span class="keyword">import</span> async_playwright</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> urllib <span class="keyword">import</span> parse</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> config <span class="keyword">import</span> plugin_config</span><br><span class="line"><span class="keyword">import</span> feedparser</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"></span><br><span class="line">link_path = plugin_config.link_path</span><br><span class="line"></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">检查友链的博客主题必须是Butterfly主题，友链的博客是什么主题就无所谓了</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">friend_qu</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, url</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        :param url: 你的友链链接，必须Butterfly主题</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        self.link = url</span><br><span class="line">        self.data = <span class="built_in">dict</span>()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">cancel_request</span>(<span class="params">self, route, request</span>):</span><br><span class="line">        <span class="keyword">await</span> route.abort()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">get_friends</span>(<span class="params">self</span>) -&gt; <span class="built_in">dict</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        获取你的所有友链信息</span></span><br><span class="line"><span class="string">        :return:</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">async</span> <span class="keyword">with</span> async_playwright() <span class="keyword">as</span> p:</span><br><span class="line">            browser = <span class="keyword">await</span> p.chromium.launch(headless=<span class="literal">True</span>)</span><br><span class="line">            page = <span class="keyword">await</span> browser.new_page()</span><br><span class="line">            response = <span class="keyword">await</span> page.goto(self.link)</span><br><span class="line">            <span class="keyword">if</span> response.status != <span class="number">200</span> <span class="keyword">and</span> response.status != <span class="number">503</span>:  <span class="comment"># 503是防止糖果屋这种类型的博客</span></span><br><span class="line">                exit(<span class="number">1</span>)</span><br><span class="line">            <span class="keyword">await</span> page.route(re.<span class="built_in">compile</span>(<span class="string">r&quot;(\.png)|(\.jpg)|(\.css)|(\.webp)|(\.js)&quot;</span>), self.cancel_request)</span><br><span class="line">            <span class="comment"># await page.mouse.wheel(0, 3000)</span></span><br><span class="line">            <span class="keyword">await</span> page.click(<span class="string">&#x27;xpath=//*[@id=&quot;article-container&quot;]/div&#x27;</span>)</span><br><span class="line">            <span class="comment"># elements = await page.locator(&#x27;xpath=//*[@id=&quot;article-container&quot;]//div/a&#x27;).all_inner_texts()</span></span><br><span class="line">            res = <span class="keyword">await</span> page.query_selector_all(<span class="string">&#x27;xpath=//*[@id=&quot;article-container&quot;]//div/a&#x27;</span>)</span><br><span class="line"></span><br><span class="line">            x = <span class="number">0</span></span><br><span class="line">            <span class="comment"># x1 = 0</span></span><br><span class="line">            kk = []</span><br><span class="line">            title = <span class="string">&#x27;&#x27;</span></span><br><span class="line">            datas = &#123;&#125;</span><br><span class="line">            k = []</span><br><span class="line">            <span class="keyword">for</span> element <span class="keyword">in</span> res:</span><br><span class="line">                <span class="comment"># x1 += 1</span></span><br><span class="line">                text = <span class="keyword">await</span> element.text_content()</span><br><span class="line">                <span class="keyword">if</span> text:</span><br><span class="line">                    x += <span class="number">1</span></span><br><span class="line">                <span class="comment"># if x1 &gt;= 5:</span></span><br><span class="line">                <span class="comment">#     if x1 == x:</span></span><br><span class="line">                <span class="comment">#         break</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">            <span class="comment"># 这里计算出每个人有多少图片 包含头像缩略图等</span></span><br><span class="line">            x1 = <span class="built_in">len</span>(res) / x</span><br><span class="line"></span><br><span class="line">            x = <span class="number">0</span></span><br><span class="line">            x2 = <span class="number">0</span></span><br><span class="line">            <span class="keyword">for</span> element <span class="keyword">in</span> res:</span><br><span class="line">                x += <span class="number">1</span></span><br><span class="line">                href = <span class="keyword">await</span> element.get_attribute(<span class="string">&quot;href&quot;</span>)</span><br><span class="line">                text = <span class="keyword">await</span> element.text_content()</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&#x27;获取友链进度：&#x27;</span> + <span class="built_in">str</span>(<span class="built_in">round</span>(x / <span class="built_in">len</span>(res) * <span class="number">100</span>, <span class="number">1</span>)) + <span class="string">&#x27;%&#x27;</span>)</span><br><span class="line">                <span class="comment"># print(x, href, text)</span></span><br><span class="line">                k.append(href)</span><br><span class="line">                x2 += <span class="number">1</span></span><br><span class="line">                <span class="keyword">if</span> text:</span><br><span class="line">                    title = text</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> x1 - x2 &lt;= <span class="number">0</span>:</span><br><span class="line">                    <span class="comment"># 把图片和链接都拼接起来</span></span><br><span class="line">                    k = <span class="built_in">sorted</span>(k, key=<span class="built_in">len</span>)</span><br><span class="line">                    kk += [&#123;<span class="string">&#x27;desc&#x27;</span>: title, <span class="string">&#x27;url&#x27;</span>: k&#125;]</span><br><span class="line">                    k = []</span><br><span class="line">                    x2 = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">            <span class="comment"># datas.update(&#123;&#x27;data&#x27;: kk&#125;)</span></span><br><span class="line">            self.data.update(&#123;<span class="string">&#x27;data&#x27;</span>: kk&#125;)</span><br><span class="line">            <span class="built_in">print</span>(self.data)</span><br><span class="line">            <span class="keyword">await</span> page.close()</span><br><span class="line">            <span class="keyword">await</span> browser.close()</span><br><span class="line">            <span class="keyword">return</span> datas</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">friend_post</span>(<span class="params">self, ran=<span class="literal">False</span></span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        进入你友链的主页获取一篇他的文章</span></span><br><span class="line"><span class="string">        :param ran: 是否随机取一篇文章，默认否，取最新文章</span></span><br><span class="line"><span class="string">        :return:</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        kk = []</span><br><span class="line">        x = <span class="number">0</span></span><br><span class="line">        data_json = <span class="built_in">dict</span>()</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> urls <span class="keyword">in</span> self.data[<span class="string">&#x27;data&#x27;</span>]:</span><br><span class="line">            x += <span class="number">1</span></span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&#x27;获取文章进度：&#x27;</span> + <span class="built_in">str</span>(<span class="built_in">round</span>(x / <span class="built_in">len</span>(self.data[<span class="string">&#x27;data&#x27;</span>]) * <span class="number">100</span>, <span class="number">1</span>)) + <span class="string">&#x27;%&#x27;</span>)</span><br><span class="line">            url = urls[<span class="string">&#x27;url&#x27;</span>][<span class="number">0</span>]</span><br><span class="line">            url = url + <span class="string">&#x27;atom.xml&#x27;</span> <span class="keyword">if</span> url[-<span class="number">1</span>] == <span class="string">&#x27;/&#x27;</span> <span class="keyword">else</span> url + <span class="string">&#x27;/atom.xml&#x27;</span></span><br><span class="line">            <span class="comment"># print(url)</span></span><br><span class="line">            avatar = <span class="string">&#x27;&#x27;</span> <span class="keyword">if</span> <span class="built_in">len</span>(urls[<span class="string">&#x27;url&#x27;</span>]) == <span class="number">1</span> <span class="keyword">else</span> urls[<span class="string">&#x27;url&#x27;</span>][<span class="built_in">len</span>(urls[<span class="string">&#x27;url&#x27;</span>]) - <span class="number">1</span>]</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                ret = feedparser.parse(url)</span><br><span class="line">                socket.setdefaulttimeout(<span class="number">5</span>)</span><br><span class="line">                <span class="keyword">if</span> ret[<span class="string">&#x27;status&#x27;</span>] == <span class="number">200</span>:</span><br><span class="line">                    num = <span class="number">0</span> <span class="keyword">if</span> ran <span class="keyword">is</span> <span class="literal">False</span> <span class="keyword">else</span> random.randint(<span class="number">0</span>, <span class="built_in">len</span>(ret.entries) - <span class="number">1</span>)</span><br><span class="line">                    kk += [&#123;<span class="string">&#x27;title&#x27;</span>: ret[<span class="string">&#x27;entries&#x27;</span>][num][<span class="string">&#x27;title&#x27;</span>],  <span class="comment"># 文章标题</span></span><br><span class="line">                            <span class="string">&#x27;num&#x27;</span>: <span class="built_in">len</span>(ret.entries),  <span class="comment"># 文章总数</span></span><br><span class="line">                            <span class="string">&#x27;url&#x27;</span>: ret[<span class="string">&#x27;entries&#x27;</span>][num][<span class="string">&#x27;link&#x27;</span>],  <span class="comment"># 文章链接</span></span><br><span class="line">                            <span class="string">&#x27;date&#x27;</span>: ret[<span class="string">&#x27;entries&#x27;</span>][num][<span class="string">&#x27;published&#x27;</span>],  <span class="comment"># 文章发表时间</span></span><br><span class="line">                            <span class="string">&#x27;avatar&#x27;</span>: avatar,  <span class="comment"># 头像</span></span><br><span class="line">                            <span class="string">&#x27;author&#x27;</span>: urls[<span class="string">&#x27;desc&#x27;</span>]  <span class="comment"># 作者</span></span><br><span class="line">                            &#125;]</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">&#x27;未开启rss&#x27;</span>)</span><br><span class="line">            <span class="keyword">except</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&#x27;未开启rss&#x27;</span>)</span><br><span class="line"></span><br><span class="line">        data_json.update(&#123;<span class="string">&#x27;data&#x27;</span>: kk&#125;)</span><br><span class="line">        <span class="built_in">print</span>(json.dumps(data_json))</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        返回字段释义</span></span><br><span class="line"><span class="string">        &#123;&quot;data&quot;: [&#123;&quot;title&quot;: &quot;\u81ea\u5b9a\u7fa9\u5074\u908a\u6b04&quot;, &quot;num&quot;: 17, &quot;url&quot;: &quot;https://butterfly.js.org/posts/ea33ab97/&quot;, &quot;date&quot;: &quot;2020-12-30T13:48:10.000Z&quot;, &quot;avatar&quot;: &quot;https://butterfly.js.org/img/avatar.png&quot;&#125;]&#125;</span></span><br><span class="line"><span class="string">        title： 文章标题</span></span><br><span class="line"><span class="string">        num： 文章总数</span></span><br><span class="line"><span class="string">        url： 文章链接</span></span><br><span class="line"><span class="string">        date： 文章发表时间 非更新时间</span></span><br><span class="line"><span class="string">        avatar： 头像</span></span><br><span class="line"><span class="string">        </span></span><br><span class="line"><span class="string">        下次更新适配未开启rss的博客</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">return</span> data_json</span><br><span class="line"></span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">friend_query</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        进入你友链的主页获取对方是否添加了你</span></span><br><span class="line"><span class="string">        :return:</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        k = []</span><br><span class="line">        kk = &#123;&#125;</span><br><span class="line">        datas = &#123;&#125;</span><br><span class="line">        x1 = <span class="number">0</span></span><br><span class="line">        session = requests.Session()</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> self.data[<span class="string">&#x27;data&#x27;</span>]:</span><br><span class="line">            x1 += <span class="number">1</span></span><br><span class="line">            <span class="comment"># print(&#x27;desc&#x27;, i[&#x27;desc&#x27;])</span></span><br><span class="line">            link = i[<span class="string">&#x27;url&#x27;</span>][<span class="number">0</span>]</span><br><span class="line">            host = parse.urlparse(self.link).netloc</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&#x27;查询友链进度：&#x27;</span> + <span class="built_in">str</span>(<span class="built_in">round</span>(x1 / <span class="built_in">len</span>(self.data[<span class="string">&#x27;data&#x27;</span>]) * <span class="number">100</span>, <span class="number">1</span>)) + <span class="string">&#x27;%&#x27;</span>)</span><br><span class="line">            <span class="keyword">if</span> host <span class="keyword">not</span> <span class="keyword">in</span> link:</span><br><span class="line">                data = i</span><br><span class="line">                <span class="keyword">for</span> links <span class="keyword">in</span> link_path:</span><br><span class="line">                    friend_link = link + links + <span class="string">&#x27;/&#x27;</span> <span class="keyword">if</span> link[-<span class="number">1</span>] == <span class="string">&#x27;/&#x27;</span> <span class="keyword">else</span> (link + <span class="string">&#x27;/%s/&#x27;</span> % links)</span><br><span class="line">                    <span class="built_in">print</span>(friend_link)</span><br><span class="line">                    <span class="keyword">try</span>:</span><br><span class="line">                        response = session.get(friend_link, timeout=<span class="number">5</span>)</span><br><span class="line">                        <span class="keyword">if</span> response.status_code == <span class="number">200</span>:</span><br><span class="line">                            html = response.text</span><br><span class="line">                            <span class="comment"># print(&#x27;host&#x27;, host)</span></span><br><span class="line">                            <span class="keyword">if</span> host <span class="keyword">in</span> html:</span><br><span class="line">                                kk = &#123;<span class="string">&#x27;add&#x27;</span>: <span class="literal">True</span>&#125;</span><br><span class="line">                            <span class="keyword">else</span>:</span><br><span class="line">                                kk = &#123;<span class="string">&#x27;add&#x27;</span>: <span class="literal">False</span>&#125;</span><br><span class="line">                            <span class="keyword">break</span></span><br><span class="line">                        <span class="keyword">else</span>:</span><br><span class="line">                            kk = &#123;<span class="string">&#x27;msg&#x27;</span>: <span class="string">&#x27;请求失败&#x27;</span>&#125;</span><br><span class="line">                    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">                        kk = &#123;<span class="string">&#x27;msg&#x27;</span>: <span class="string">&#x27;请求失败&#x27;</span>&#125;</span><br><span class="line">                        <span class="built_in">print</span>(e)</span><br><span class="line">                data.update(kk)</span><br><span class="line">                k.append(data)</span><br><span class="line">                <span class="comment"># print(data)</span></span><br><span class="line">        datas.update(&#123;<span class="string">&#x27;data&#x27;</span>: k&#125;)</span><br><span class="line">        <span class="built_in">print</span>(json.dumps(datas))</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        [&#123;&quot;desc&quot;: &quot;\u5f20\u6d2aHeo \u5206\u4eab\u8bbe\u8ba1\u4e0e\u79d1\u6280\u751f\u6d3b&quot;, &quot;url&quot;: [&quot;https://blog.zhheo.com/&quot;], &quot;add&quot;: true&#125;]</span></span><br><span class="line"><span class="string">        返回字段释义：desc=昵称加个性签名</span></span><br><span class="line"><span class="string">        url:博客地址</span></span><br><span class="line"><span class="string">        add:是否添加了你</span></span><br><span class="line"><span class="string">        msg:一般是请求失败了，他的友链路径非“/link”</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">return</span> datas</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    url = <span class="string">&#x27;https://akilar.top/link/&#x27;</span></span><br><span class="line">    res = friend_qu(url)</span><br><span class="line">    <span class="comment"># 获取友链详情</span></span><br><span class="line">    <span class="keyword">await</span> res.get_friends()</span><br><span class="line">    <span class="comment"># 查询友链是否添加了你</span></span><br><span class="line">    <span class="keyword">await</span> res.friend_query()</span><br><span class="line">    <span class="comment"># 获取友链主页的最新文章或随机文章</span></span><br><span class="line">    <span class="keyword">await</span> res.friend_post(<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    asyncio.run(main())</span><br></pre></td></tr></table></figure>              </div>            </details><details class="folding-tag" cyan><summary> 配置文件代码 </summary>              <div class='content'>              <figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/8/20 17:58</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : config.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="keyword">from</span> pydantic <span class="keyword">import</span> BaseModel</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Config</span>(<span class="title class_ inherited__">BaseModel</span>):</span><br><span class="line">    <span class="comment"># 设置友链路径</span></span><br><span class="line">    link_path: <span class="built_in">list</span> = [<span class="string">&#x27;link&#x27;</span>, <span class="string">&#x27;friend&#x27;</span>, <span class="string">&#x27;friends&#x27;</span>]</span><br><span class="line"></span><br><span class="line">plugin_config = Config.parse_obj(&#123;&#125;)</span><br></pre></td></tr></table></figure>              </div>            </details><h1 id="未完待续"><a href="#未完待续" class="headerlink" title="未完待续"></a>未完待续</h1><ul><li>下次更新适配未开启rss的博客</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;Q: 已经有成熟可用的&lt;a href=&quot;https://fcircle-doc.js.cool/&quot;&gt;相关项目&lt;/a&gt;了为啥还要做</summary>
      
    
    
    
    <category term="Butterfly" scheme="https://www.app966.cn/categories/Butterfly/"/>
    
    
    <category term="Butterfly" scheme="https://www.app966.cn/tags/Butterfly/"/>
    
    <category term="python" scheme="https://www.app966.cn/tags/python/"/>
    
    <category term="redis" scheme="https://www.app966.cn/tags/redis/"/>
    
  </entry>
  
  <entry>
    <title>Centos安装node.js详细教程</title>
    <link href="https://www.app966.cn/post/98204530.html"/>
    <id>https://www.app966.cn/post/98204530.html</id>
    <published>2022-08-06T06:17:15.000Z</published>
    <updated>2023-01-26T12:46:36.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="下载node-js"><a href="#下载node-js" class="headerlink" title="下载node.js"></a>下载node.js</h1><ol><li>我使用的是<code>Centos7.9</code></li><li><a href="https://nodejs.org/en/download/">进入官网</a>下载页</li><li>选择下载linux-64</li><li>使用淘宝镜像源下载</li></ol><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">wget https://registry.npmmirror.com/-/binary/node/v16.16.0/node-v16.16.0-linux-x64.tar.xz</span><br></pre></td></tr></table></figure><h1 id="解压"><a href="#解压" class="headerlink" title="解压"></a>解压</h1><ul><li>复制压缩文件名，执行解压命令</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">tar -xvf node-v16.16.0-linux-x64.tar.xz</span><br></pre></td></tr></table></figure><ul><li>为了方便操作node的文件夹，将压缩后的文件移动到名为<code>node16</code>的文件夹，也可以根据自己的喜好来命名新文件夹</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mv node-v16.16.0-linux-x64 node16</span><br></pre></td></tr></table></figure><ul><li>然后再把当前目录的<code>node16</code>目录移动到<code>/usr/local</code>目录下</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mv node16 /usr/local</span><br></pre></td></tr></table></figure><h1 id="配置环境变量"><a href="#配置环境变量" class="headerlink" title="配置环境变量"></a>配置环境变量</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vi /etc/profile</span><br></pre></td></tr></table></figure><ul><li>在文件中输入以下内容，输入<code>i</code>开始编辑</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">export NODE_HOME=/usr/local/node16</span><br><span class="line">export PATH=$PATH:$NODE_HOME/bin</span><br><span class="line">export NODE_PATH=$NODE_HOME/lib/node_mudules</span><br></pre></td></tr></table></figure><ol><li>编写完成后按<code>esc</code>键退出编辑，然后输入<code>:wq</code>保存文件内容，输入错误就不要保存了输入<code>:q!</code>不保存退出再重新编辑</li><li>使配置立即生效</li></ol><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">source /etc/profile</span><br></pre></td></tr></table></figure><h1 id="创建软链接"><a href="#创建软链接" class="headerlink" title="创建软链接"></a>创建软链接</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 创建node命令链接</span><br><span class="line">ln -s /usr/local/node16/bin/node /usr/local/bin/node</span><br><span class="line"></span><br><span class="line"># 创建npm命令链接</span><br><span class="line">ln -s /usr/local/node16/bin/npm /usr/local/bin/npm</span><br></pre></td></tr></table></figure><h1 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h1><ul><li>在任意目录下输入<code>node -v</code>和<code>npm -v</code>查看版本号</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">node -v</span><br><span class="line">npm -v</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;下载node-js&quot;&gt;&lt;a href=&quot;#下载node-js&quot; class=&quot;headerlink&quot; title=&quot;下载node.js&quot;&gt;&lt;/a&gt;下载node.js&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;我使用的是&lt;code&gt;Centos7.9&lt;/code&gt;&lt;/li&gt;
&lt;li</summary>
      
    
    
    
    <category term="Centos" scheme="https://www.app966.cn/categories/Centos/"/>
    
    
    <category term="教程" scheme="https://www.app966.cn/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="node" scheme="https://www.app966.cn/tags/node/"/>
    
    <category term="Centos" scheme="https://www.app966.cn/tags/Centos/"/>
    
  </entry>
  
  <entry>
    <title>🎭 playwright 相关笔记</title>
    <link href="https://www.app966.cn/post/1dcad1c5.html"/>
    <id>https://www.app966.cn/post/1dcad1c5.html</id>
    <published>2022-08-03T05:10:53.000Z</published>
    <updated>2023-04-21T02:34:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="什么是Playwright？"><a href="#什么是Playwright？" class="headerlink" title="什么是Playwright？"></a>什么是Playwright？</h1><a class="ghcard" rel="external nofollow noopener noreferrer" href="https://github.com/microsoft/playwright"><img src="https://github-readme-stats.vercel.app/api/pin/?username=microsoft&repo=playwright&show_owner=true"/></a><ul><li><a href="https://playwright.bootcss.com/">Playwright</a>是微软在<code>2020年初</code>开源的新一代自动化测试工具，它的功能类似于<code>Selenium、Pyppeteer</code>等，都可以驱动浏览器进行各种自动化操作。它的功能也非常强大，对市面上的主流浏览器都提供了支持，API 功能简洁又强大。虽然诞生比较晚，但是现在发展得非常火热。</li><li>因为Playwright是一个类似<a href="https://python-selenium-zh.readthedocs.io/zh_CN/latest/">Selenium</a>一样可以支持网页页面渲染的工具，再加上其强大又简洁的API，Playwright同时也可以作为网络爬虫的一个爬取利器。</li><li>Playwright是<code>支持异步</code>的，异步<code>并非多线程</code>。例如：程序a2秒执行完，程序b5秒执行完，非异步的话全部执行完要<code>7</code>秒，异步的话只要<code>5</code>秒，异步需要了解<code>asyncio</code></li></ul><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">pip install playwright</span><br><span class="line">python -m playwright install</span><br></pre></td></tr></table></figure><h1 id="基本参数"><a href="#基本参数" class="headerlink" title="基本参数"></a>基本参数</h1><h2 id="Playwright基本参数"><a href="#Playwright基本参数" class="headerlink" title="Playwright基本参数"></a>Playwright基本参数</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">--headed：在有头模式下运行测试（默认：无头）。</span><br><span class="line">--browser：在不同的浏览器中运行测试chromium，firefox或webkit。可以多次指定（默认：所有浏览器）。</span><br><span class="line">--browser-channel 要使用的浏览器频道。</span><br><span class="line">--slowmo以慢动作运行测试。</span><br><span class="line">--device 要模拟的设备。</span><br><span class="line">--output测试产生的工件目录（默认值：）test-results。</span><br><span class="line">--tracing是否为每个测试记录跟踪。on, off, 或retain-on-failure（默认值：off）。</span><br><span class="line">--video是否为每次测试录制视频。on, off, 或retain-on-failure（默认值：off）。</span><br><span class="line">--screenshot每次测试后是否自动截屏。on, off, 或only-on-failure（默认值：off）。</span><br></pre></td></tr></table></figure><h2 id="Selenium基本参数"><a href="#Selenium基本参数" class="headerlink" title="Selenium基本参数"></a>Selenium基本参数</h2><p><a href="https://peter.sh/experiments/chromium-command-line-switches/">查看更多</a></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># options.add_argument(&#x27;--headless&#x27;)                     # 开启无界面模式</span><br><span class="line"># options.add_argument(&quot;--disable-gpu&quot;)                  # 禁用gpu</span><br><span class="line"># options.add_argument(&#x27;--user-agent=Mozilla/5.0 HAHA&#x27;)  # 配置对象添加替换User-Agent的命令</span><br><span class="line"># options.add_argument(&#x27;--window-size=1366,768&#x27;)         # 设置浏览器分辨率（窗口大小）</span><br><span class="line"># options.add_argument(&#x27;--start-maximized&#x27;)              # 最大化运行（全屏窗口）,不设置，取元素会报错</span><br><span class="line"># options.add_argument(&#x27;--disable-infobars&#x27;)             # 禁用浏览器正在被自动化程序控制的提示</span><br><span class="line"># options.add_argument(&#x27;--incognito&#x27;)                    # 隐身模式（无痕模式）</span><br><span class="line"># options.add_argument(&#x27;--disable-javascript&#x27;)           # 禁用javascript</span><br><span class="line"># options.add_argument(&#x27;--disable-plugins&#x27;) # 禁止加载所有插件</span><br><span class="line"># options.add_argument(&#x27;--blink-settings=imagesEnabled=false&#x27;) # 禁止加载图片</span><br><span class="line"># options.add_argument(&#x27;--user-agent=xx&#x27;)  # 配置对象添加替换User-Agent的命令</span><br></pre></td></tr></table></figure><h1 id="基本使用"><a href="#基本使用" class="headerlink" title="基本使用"></a>基本使用</h1><h2 id="获取谷歌统计示例"><a href="#获取谷歌统计示例" class="headerlink" title="获取谷歌统计示例"></a>获取谷歌统计示例</h2><ul><li>获取谷歌的统计信息</li></ul><div class="tabs" id="基本使用"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#基本使用-1">playwright同步</button></li><li class="tab"><button type="button" data-href="#基本使用-2">playwright异步</button></li><li class="tab"><button type="button" data-href="#基本使用-3">selenium</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="基本使用-1"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> playwright.sync_api <span class="keyword">import</span> sync_playwright</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">cancel_request</span>(<span class="params">route, request</span>):</span><br><span class="line">    route.abort()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">google</span>(<span class="params">p, link</span>):</span><br><span class="line">    url = <span class="string">&#x27;https://www.google.com/search?q=site%3A&#x27;</span> + link</span><br><span class="line">    proxy = &#123;</span><br><span class="line">        <span class="string">&#x27;server&#x27;</span>: <span class="string">&#x27;http://127.0.0.1:7890&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">    browser = p.webkit.launch(headless=<span class="literal">False</span>, proxy=proxy)</span><br><span class="line">    context = browser.new_context()</span><br><span class="line">    page.route(re.<span class="built_in">compile</span>(<span class="string">r&quot;(\.png)|(\.jpg)|(\.css)&quot;</span>), cancel_request)</span><br><span class="line">    page = context.new_page()</span><br><span class="line">    page.goto(url)</span><br><span class="line">    res = page.query_selector(<span class="string">&#x27;xpath=//*[@id=&quot;result-stats&quot;]&#x27;</span>)</span><br><span class="line">    res_info = res.text_content()</span><br><span class="line">    browser.close()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> res_info:</span><br><span class="line">        res_info = <span class="string">&#x27;未收录&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> res_info</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="keyword">with</span> sync_playwright() <span class="keyword">as</span> playwright:</span><br><span class="line">        ret = google(playwright, <span class="string">&#x27;app966.cn&#x27;</span>)</span><br><span class="line">        <span class="built_in">print</span>(ret)</span><br><span class="line">        </span><br><span class="line">main()</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="基本使用-2"><ul><li>注意异步引入的是<code>playwright.async_api</code>，这里我就踩坑了，导致一直报错</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> asyncio</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> playwright.async_api <span class="keyword">import</span> async_playwright</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">cancel_request</span>(<span class="params">route, request</span>):</span><br><span class="line">    <span class="keyword">await</span> route.abort()</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">google</span>(<span class="params">p, link</span>):</span><br><span class="line">    url = <span class="string">&#x27;https://www.google.com/search?q=site%3A&#x27;</span> + link</span><br><span class="line">    proxy = &#123;</span><br><span class="line">        <span class="string">&#x27;server&#x27;</span>: <span class="string">&#x27;http://127.0.0.1:7890&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">    browser = <span class="keyword">await</span> p.webkit.launch(headless=<span class="literal">False</span>, proxy=proxy)</span><br><span class="line">    context = <span class="keyword">await</span> browser.new_context()</span><br><span class="line">    page = <span class="keyword">await</span> context.new_page()</span><br><span class="line">    <span class="keyword">await</span> page.route(re.<span class="built_in">compile</span>(<span class="string">r&quot;(\.png)|(\.jpg)|(\.css)&quot;</span>), cancel_request)</span><br><span class="line">    <span class="keyword">await</span> page.goto(url)</span><br><span class="line">    res = <span class="keyword">await</span> page.query_selector(<span class="string">&#x27;xpath=//*[@id=&quot;result-stats&quot;]&#x27;</span>)</span><br><span class="line">    res_info = res.text_content()</span><br><span class="line">    <span class="keyword">await</span> browser.close()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> res_info:</span><br><span class="line">        res_info = <span class="string">&#x27;未收录&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> res_info</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">with</span> async_playwright() <span class="keyword">as</span> playwright:</span><br><span class="line">        ret = <span class="keyword">await</span> google(playwright, <span class="string">&#x27;app966.cn&#x27;</span>)</span><br><span class="line">        <span class="built_in">print</span>(ret)</span><br><span class="line"></span><br><span class="line">asyncio.run(main())</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="基本使用-3"><ul><li>Selenium的相同操作代码我也放下吧，这里是<code>Selenium 4.3.0</code>版本，旧版不适用</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.common.by <span class="keyword">import</span> By</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">google</span>(<span class="params">link</span>):</span><br><span class="line">    url = <span class="string">&#x27;https://www.google.com/search?q=site%3A&#x27;</span> + link</span><br><span class="line">    prefs = &#123;<span class="string">&quot;profile.managed_default_content_settings.images&quot;</span>: <span class="number">2</span>, <span class="string">&#x27;permissions.default.stylesheet&#x27;</span>: <span class="number">2</span>&#125;</span><br><span class="line">    options = ChromeOptions()</span><br><span class="line">    options.add_experimental_option(<span class="string">&quot;prefs&quot;</span>, prefs)</span><br><span class="line">    options.add_argument(<span class="string">&quot;--headless&quot;</span>)</span><br><span class="line">    options.add_argument(<span class="string">&#x27;--incognito&#x27;</span>)</span><br><span class="line">    options.add_argument(<span class="string">&#x27;--blink-settings=imagesEnabled=false&#x27;</span>)</span><br><span class="line">    browser = webdriver.Chrome(executable_path=<span class="string">r&#x27;C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe&#x27;</span>, options=options)</span><br><span class="line">    browser.get(url)</span><br><span class="line">    res = browser.find_element(By.XPATH, <span class="string">&#x27;//*[@id=&quot;result-stats&quot;]&#x27;</span>).text</span><br><span class="line">    browser.close()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> res:</span><br><span class="line">        res = <span class="string">&#x27;未收录&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> res</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="禁用css、图片以提升访问速度"><a href="#禁用css、图片以提升访问速度" class="headerlink" title="禁用css、图片以提升访问速度"></a>禁用css、图片以提升访问速度</h2><div class="tabs" id="禁用"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#禁用-1">playwright</button></li><li class="tab"><button type="button" data-href="#禁用-2">selenium</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="禁用-1"><ul><li>使用<code>route.abort</code>中止请求</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">await</span> page.route(re.<span class="built_in">compile</span>(<span class="string">r&quot;(\.png)|(\.jpg)|(\.css)&quot;</span>), route.abort())</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="禁用-2"><ul><li>设置基本参数</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver <span class="keyword">import</span> ChromeOptions</span><br><span class="line">options = ChromeOptions()</span><br><span class="line">prefs = &#123;<span class="string">&quot;profile.managed_default_content_settings.images&quot;</span>: <span class="number">2</span>,<span class="string">&#x27;permissions.default.stylesheet&#x27;</span>:<span class="number">2</span>&#125;</span><br><span class="line">options.add_experimental_option(<span class="string">&quot;prefs&quot;</span>, prefs)</span><br><span class="line">browser = webdriver.Chrome(executable_path=<span class="string">&#x27;xxx\chromedriver.exe&#x27;</span>, options=options)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h1 id="Playwright与其它主流测试框架对比"><a href="#Playwright与其它主流测试框架对比" class="headerlink" title="Playwright与其它主流测试框架对比"></a>Playwright与其它主流测试框架对比</h1><div class="table-container"><table><thead><tr><th>能力</th><th>Playwright</th><th>Puppeteer</th><th>Selenium</th></tr></thead><tbody><tr><td>速度</td><td>快</td><td>快</td><td>慢</td></tr><tr><td>归档能力</td><td>优秀</td><td>优秀</td><td>普通</td></tr><tr><td>开发体验</td><td>好</td><td>比较好</td><td>普通</td></tr><tr><td>支持的语言</td><td>JavaScript、Python、C#和Java</td><td>JavaScript</td><td>Java、Python、C#、Ruby、JavaScript和Kotlin</td></tr><tr><td>支持方</td><td>微软</td><td>谷歌</td><td>社区和赞助商</td></tr><tr><td>社区</td><td>小而活跃</td><td>大而活跃</td><td>大而活跃</td></tr><tr><td>浏览器支持</td><td>Chromium、Firefox和WebKit</td><td>Chromium</td><td>Chrome、Firefox、IE、Edge、Opera和Safari等</td></tr></tbody></table></div><h1 id="未完待续"><a href="#未完待续" class="headerlink" title="未完待续"></a>未完待续</h1><ul><li>Playwright我也是刚学不久，有更多优秀的操作案例我会持续更新的</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;什么是Playwright？&quot;&gt;&lt;a href=&quot;#什么是Playwright？&quot; class=&quot;headerlink&quot; title=&quot;什么是Playwright？&quot;&gt;&lt;/a&gt;什么是Playwright？&lt;/h1&gt;&lt;a class=&quot;ghcard&quot; rel=&quot;ex</summary>
      
    
    
    
    <category term="playwright" scheme="https://www.app966.cn/categories/playwright/"/>
    
    
    <category term="playwright" scheme="https://www.app966.cn/tags/playwright/"/>
    
  </entry>
  
  <entry>
    <title>抖音直播弹幕捕获【转载 + 修改】</title>
    <link href="https://www.app966.cn/post/175a7cfe.html"/>
    <id>https://www.app966.cn/post/175a7cfe.html</id>
    <published>2022-07-29T23:27:53.000Z</published>
    <updated>2023-01-26T12:46:36.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><ol><li>无意在精易论坛看到了<a href="https://bbs.125.la/thread-14739135-1-2.html">这个帖子</a><div class="img-wrap"><div class="img-bg"><img class="img" src="/temp/img/dylive_1.png"/></div></div></li><li>简单浏览了下这个源码的逻辑就是运行<code>webDriver.py</code>把弹幕下载下来并且存放在<code>douyinLiveFile</code>文件夹中</li><li>然后运行<code>webChat.py</code>去读<code>douyinLiveFile</code>文件夹中下载好的弹幕并解析</li><li>是通过<code>playwright</code>检测网页响应状态，对于爬虫来说就是自动抓取指定的内容，不需要任何算法，反爬将毫无意义，这让我想起了另一款神器<code>selenium</code></li><li>这里很有必要去了解一下<a href="https://segmentfault.com/a/1190000038697288">Playwright是什么</a></li><li>补充：这个方法比wss连接的要好，物理外挂最为致命，并且playwright是<code>支持异步</code>的，也就是可以<code>执行多个</code>直播间的任务，具体转到<a href="https://playwright.dev/python/docs/intro">playwright官方文档</a>查阅</li><li>简单的加密已经不能防范这个方式的爬虫了，只要浏览器可以看的它都可以获取</li><li>此源码需要有python基础，不太适合新手，因为这个只是做了个获取演示，你需要再去修改处理获取后的内容，要更方便的使用最好部署在服务器中</li><li>我博客很多内容都是一个结果而没有分析过程导致好像是搬运而来的一样，我只是不太喜欢写教程以及过程这样太麻烦了，后面会慢慢改正</li></ol><h1 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h1><p><strong>注意事项</strong></p><ul><li>只能使用网页版直播链接</li><li>我这里只放<code>修改</code>处</li><li><a href="/temp/抖音弹幕捕获.zip">点击此处下载</a>完整版</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> shutil</span><br><span class="line"><span class="keyword">from</span> google.protobuf.json_format <span class="keyword">import</span> MessageToDict</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> messages.message_pb2 <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">import</span> asyncio</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">getScriptDir</span>():</span><br><span class="line">    <span class="keyword">return</span> os.path.split(os.path.realpath(__file__))[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Watcher</span>():</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line">        self.monitoringFile = <span class="string">f&#x27;<span class="subst">&#123;getScriptDir()&#125;</span>\\douyinLiveFile&#x27;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">startWatcher</span>(<span class="params">self</span>):</span><br><span class="line">            files = os.listdir(self.monitoringFile)</span><br><span class="line">            <span class="keyword">if</span> files:</span><br><span class="line">                <span class="keyword">for</span> _ <span class="keyword">in</span> files:</span><br><span class="line">                    filepath = self.monitoringFile + <span class="string">&#x27;\\&#x27;</span> + _</span><br><span class="line">                    <span class="keyword">with</span> <span class="built_in">open</span>(filepath, <span class="string">&#x27;rb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">                        datas = &#123;&#125;</span><br><span class="line">                        messages = []</span><br><span class="line">                        danmu_resp = Response()</span><br><span class="line">                        danmu_resp.ParseFromString(f.read())</span><br><span class="line">                        f.close()</span><br><span class="line">                        obj = MessageToDict(danmu_resp, preserving_proto_field_name=<span class="literal">True</span>)</span><br><span class="line">                        <span class="keyword">if</span> obj:</span><br><span class="line">                            <span class="keyword">if</span> obj.get(<span class="string">&#x27;messages&#x27;</span>):</span><br><span class="line">                                datas.update(&#123;<span class="string">&#x27;now&#x27;</span>: obj.get(<span class="string">&#x27;now&#x27;</span>)&#125;)</span><br><span class="line">                                <span class="keyword">for</span> message <span class="keyword">in</span> obj[<span class="string">&quot;messages&quot;</span>]:</span><br><span class="line">                                    method = message[<span class="string">&quot;method&quot;</span>]</span><br><span class="line">                                    payload = <span class="built_in">bytes</span>(base64.b64decode(message[<span class="string">&quot;payload&quot;</span>].encode()))</span><br><span class="line">                                    <span class="keyword">if</span> method == <span class="string">&quot;WebcastMemberMessage&quot;</span>:</span><br><span class="line">                                        menber_message = MemberMessage()</span><br><span class="line">                                        menber_message.ParseFromString(payload)</span><br><span class="line">                                        obj1 = MessageToDict(menber_message, preserving_proto_field_name=<span class="literal">True</span>)</span><br><span class="line">                                        obj1 = &#123;<span class="string">&#x27;method&#x27;</span>: method, <span class="string">&#x27;msgId&#x27;</span>: message[<span class="string">&#x27;msgId&#x27;</span>], <span class="string">&#x27;payload&#x27;</span>: obj1&#125;</span><br><span class="line">                                        messages.append(obj1)</span><br><span class="line">                                    <span class="keyword">if</span> method == <span class="string">&quot;WebcastChatMessage&quot;</span>:</span><br><span class="line">                                        menber_message5 = ChatMessage()</span><br><span class="line">                                        menber_message5.ParseFromString(payload)</span><br><span class="line">                                        obj2 = MessageToDict(menber_message5, preserving_proto_field_name=<span class="literal">True</span>)</span><br><span class="line">                                        obj2 = &#123;<span class="string">&#x27;method&#x27;</span>: method, <span class="string">&#x27;msgId&#x27;</span>: message[<span class="string">&#x27;msgId&#x27;</span>], <span class="string">&#x27;payload&#x27;</span>: obj2&#125;</span><br><span class="line">                                        messages.append(obj2)</span><br><span class="line"></span><br><span class="line">                                datas.update(&#123;<span class="string">&#x27;data&#x27;</span>: messages&#125;)</span><br><span class="line">                                ret = json.dumps(datas)</span><br><span class="line">                                <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;./userImages/&#x27;</span> + <span class="built_in">str</span>(<span class="built_in">int</span>(time.time())) + <span class="string">&#x27;.json&#x27;</span>, <span class="string">&#x27;w&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">                                    file.write(ret)</span><br><span class="line">                                    file.close()</span><br><span class="line"></span><br><span class="line">                        <span class="keyword">else</span>:</span><br><span class="line">                            ret = &#123;<span class="string">&#x27;msg&#x27;</span>: <span class="string">&#x27;请先运行webdriver获取弹幕文件&#x27;</span>&#125;</span><br><span class="line"></span><br><span class="line">            <span class="built_in">print</span>(ret)</span><br><span class="line">            <span class="keyword">return</span> ret</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(getScriptDir()+<span class="string">&quot;\\douyinLiveFile&quot;</span>):<span class="comment"># 这里存放未解析的弹幕文件</span></span><br><span class="line">        os.makedirs(getScriptDir()+<span class="string">&quot;\\douyinLiveFile&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(getScriptDir()+<span class="string">&quot;\\userImages&quot;</span>):<span class="comment"># 这里存放解析好的json数据文件</span></span><br><span class="line">        os.makedirs(getScriptDir()+<span class="string">&quot;\\userImages&quot;</span>)</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">            time.sleep(<span class="number">1</span>)</span><br><span class="line">            asyncio.run(Watcher().startWatcher())</span><br></pre></td></tr></table></figure><h1 id="结束"><a href="#结束" class="headerlink" title="结束"></a>结束</h1><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>本源码仅限学习交流</p>            </div><div class='checkbox times red checked'><input type="checkbox" checked="checked"/>            <p>请勿用于非法途径</p>            </div><div class="img-wrap"><div class="img-bg"><img class="img" src="/img/dylive.png"/></div></div>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;无意在精易论坛看到了&lt;a href=&quot;https://bbs.125.la/thread-14739135-1-2.html&quot;&gt;</summary>
      
    
    
    
    <category term="python" scheme="https://www.app966.cn/categories/python/"/>
    
    
    <category term="python" scheme="https://www.app966.cn/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>抖音汽水音乐API</title>
    <link href="https://www.app966.cn/post/cf85313.html"/>
    <id>https://www.app966.cn/post/cf85313.html</id>
    <published>2022-07-29T23:14:33.000Z</published>
    <updated>2023-01-26T12:46:36.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><ol><li>收集了那么多音乐api不差这一个了</li><li>这个播放器的音乐都是网红歌曲，主要为了获取榜单排行榜音乐</li><li>这个播放器有加密但是它不校验加密，丢浏览器都能直接请求的那种</li><li>好像是抖音旗下的属实有点冷门</li><li>不逼逼了直接放代码结束</li></ol><h1 id="代码区"><a href="#代码区" class="headerlink" title="代码区"></a>代码区</h1><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> coke;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONArray;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONObject;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.HttpResponse;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.client.methods.HttpGet;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.client.methods.HttpPost;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.entity.StringEntity;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.impl.client.CloseableHttpClient;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.impl.client.HttpClients;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.util.EntityUtils;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.text.MessageFormat;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">coke_music</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">get_musiclist</span><span class="params">(<span class="type">int</span> music_type)</span>&#123;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        获取歌单列表</span></span><br><span class="line"><span class="comment">        music_type=类型</span></span><br><span class="line"><span class="comment">        0=每日推荐</span></span><br><span class="line"><span class="comment">        93=官方</span></span><br><span class="line"><span class="comment">        9=欧美</span></span><br><span class="line"><span class="comment">        38=说唱</span></span><br><span class="line"><span class="comment">        16=电子</span></span><br><span class="line"><span class="comment">        15=摇滚</span></span><br><span class="line"><span class="comment">        18=民谣</span></span><br><span class="line"><span class="comment">        19=R&amp;B</span></span><br><span class="line"><span class="comment">        20=国风</span></span><br><span class="line"><span class="comment">        40=学习</span></span><br><span class="line"><span class="comment">        45=睡前</span></span><br><span class="line"><span class="comment">        69=治愈</span></span><br><span class="line"><span class="comment">        8=华语</span></span><br><span class="line"><span class="comment">        14=流行</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;https://beta-luna.douyin.com/luna/feed/playlist-square?request_tag_from=lynx&amp;device_platform=android&amp;os=android&amp;ssmix=a&amp;_rticket=1659112744687&amp;cdid=4a6a891c-e1e1-4fec-8ef6-94f28a302b0b&amp;channel=xiaomi_8478&amp;aid=8478&amp;app_name=luna&amp;version_code=10090140&amp;version_name=1.9.1&amp;manifest_version_code=10090140&amp;update_version_code=10090140&amp;resolution=1080*2030&amp;dpi=440&amp;device_type=MI+6X&amp;device_brand=xiaomi&amp;language=zh&amp;os_api=28&amp;os_version=9&amp;ac=wifi&amp;package=com.luna.music&amp;hybrid_version_code=10090140&amp;device_model=MI+6X&amp;tz_name=Asia%2FShanghai&amp;tz_offset=28800&amp;network_speed=5246&amp;iid=&amp;device_id=&quot;</span>;</span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">param</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONObject</span>();</span><br><span class="line">        param.put(<span class="string">&quot;category_id&quot;</span>, music_type);</span><br><span class="line">        <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">HttpPost</span> <span class="variable">httpPost</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HttpPost</span>(url);</span><br><span class="line">        <span class="type">CloseableHttpClient</span> <span class="variable">client</span> <span class="operator">=</span> HttpClients.createDefault();</span><br><span class="line">        <span class="type">StringEntity</span> <span class="variable">entity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringEntity</span>(param.toJSONString(), <span class="string">&quot;UTF-8&quot;</span>);</span><br><span class="line">        httpPost.setHeader(<span class="string">&quot;User-Agent&quot;</span>, <span class="string">&quot;Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1&quot;</span>);</span><br><span class="line">        httpPost.setEntity(entity);</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">HttpResponse</span> <span class="variable">response</span> <span class="operator">=</span> client.execute(httpPost);</span><br><span class="line">            <span class="keyword">if</span> (response.getStatusLine().getStatusCode() == <span class="number">200</span>) &#123;</span><br><span class="line">                result = EntityUtils.toString(response.getEntity(), <span class="string">&quot;utf-8&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            result = <span class="string">&quot;error&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">get_musicrank</span><span class="params">()</span>&#123;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        获取rank榜</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;https://beta-luna.douyin.com/luna/discover?device_platform=android&amp;os=android&amp;ssmix=a&amp;_rticket=1659122791092&amp;cdid=05d1276c-3cad-4d05-892c-bb5187ca51b8&amp;channel=xiaomi_8478&amp;aid=8478&amp;app_name=luna&amp;version_code=10090140&amp;version_name=1.9.1&amp;manifest_version_code=10090140&amp;update_version_code=10090140&amp;resolution=1080*2030&amp;dpi=440&amp;device_type=MI+6X&amp;device_brand=xiaomi&amp;language=zh&amp;os_api=28&amp;os_version=9&amp;ac=wifi&amp;package=com.luna.music&amp;hybrid_version_code=10090140&amp;device_model=MI+6X&amp;tz_name=Asia%2FShanghai&amp;tz_offset=28800&amp;network_speed=5297&amp;iid=&amp;device_id=&quot;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">HttpPost</span> <span class="variable">httpPost</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HttpPost</span>(url);</span><br><span class="line">        <span class="type">CloseableHttpClient</span> <span class="variable">client</span> <span class="operator">=</span> HttpClients.createDefault();</span><br><span class="line">        Map&lt;String, String&gt; map = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">        map.put(<span class="string">&quot;body&quot;</span>, <span class="literal">null</span>);</span><br><span class="line">        <span class="type">StringEntity</span> <span class="variable">entity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringEntity</span>(map.toString(), <span class="string">&quot;UTF-8&quot;</span>);</span><br><span class="line">        httpPost.setEntity(entity);</span><br><span class="line">        httpPost.setHeader(<span class="string">&quot;User-Agent&quot;</span>, <span class="string">&quot;Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1&quot;</span>);</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">HttpResponse</span> <span class="variable">response</span> <span class="operator">=</span> client.execute(httpPost);</span><br><span class="line">            <span class="keyword">if</span> (response.getStatusLine().getStatusCode() == <span class="number">200</span>) &#123;</span><br><span class="line">                result = EntityUtils.toString(response.getEntity(), <span class="string">&quot;utf-8&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            result = <span class="string">&quot;error&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">get_playlist</span><span class="params">(String playlist_id)</span>&#123;</span><br><span class="line">        <span class="comment">/*获取歌单里面的歌曲*/</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> MessageFormat.format(<span class="string">&quot;https://beta-luna.douyin.com/luna/playlist/detail?playlist_id=&#123;0&#125;&amp;cursor&amp;device_platform=android&amp;os=android&amp;ssmix=a&amp;_rticket=1659112831329&amp;cdid=4a6a891c-e1e1-4fec-8ef6-94f28a302b0b&amp;channel=xiaomi_8478&amp;aid=8478&amp;app_name=luna&amp;version_code=10090140&amp;version_name=1.9.1&amp;manifest_version_code=10090140&amp;update_version_code=10090140&amp;resolution=1080*2030&amp;dpi=440&amp;device_type=MI+6X&amp;device_brand=xiaomi&amp;language=zh&amp;os_api=28&amp;os_version=9&amp;ac=wifi&amp;package=com.luna.music&amp;hybrid_version_code=10090140&amp;device_model=MI+6X&amp;tz_name=Asia%2FShanghai&amp;tz_offset=28800&amp;network_speed=5246&amp;iid=&amp;device_id=&quot;</span>, playlist_id);</span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">HttpGet</span> <span class="variable">httpGet</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HttpGet</span>(url);</span><br><span class="line">        <span class="type">CloseableHttpClient</span> <span class="variable">client</span> <span class="operator">=</span> HttpClients.createDefault();</span><br><span class="line">        httpGet.setHeader(<span class="string">&quot;User-Agent&quot;</span>, <span class="string">&quot;Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">HttpResponse</span> <span class="variable">response</span> <span class="operator">=</span> client.execute(httpGet);</span><br><span class="line">            <span class="keyword">if</span> (response.getStatusLine().getStatusCode() == <span class="number">200</span>) &#123;</span><br><span class="line">                result = EntityUtils.toString(response.getEntity(), <span class="string">&quot;utf-8&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            result = <span class="string">&quot;error&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">musicrank</span> <span class="operator">=</span> get_musicrank();</span><br><span class="line">        System.out.println(<span class="string">&quot;榜单列表：&quot;</span> + musicrank);</span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">musiclist</span> <span class="operator">=</span> get_musiclist(<span class="number">0</span>);</span><br><span class="line">        System.out.println(<span class="string">&quot;歌单列表：&quot;</span> + musiclist);</span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">obj</span> <span class="operator">=</span> JSONObject.parseObject(musiclist);</span><br><span class="line">        List&lt;Object&gt; Array = obj.getJSONArray(<span class="string">&quot;items&quot;</span>);</span><br><span class="line">        <span class="type">JSONArray</span> <span class="variable">jsonArray</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONArray</span>(Array);</span><br><span class="line">        <span class="comment">/*这里demo就取随机一个，你也可以固定或者全部取*/</span></span><br><span class="line">        <span class="type">int</span> <span class="variable">listint</span> <span class="operator">=</span> (<span class="type">int</span>) (Math.random() * jsonArray.toArray().length);</span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">obj1</span> <span class="operator">=</span> jsonArray.getJSONObject(listint);</span><br><span class="line">        <span class="type">String</span> <span class="variable">list_id</span> <span class="operator">=</span> obj1.getString(<span class="string">&quot;id&quot;</span>);</span><br><span class="line">        System.out.println(list_id);</span><br><span class="line">        <span class="type">String</span> <span class="variable">playlist</span> <span class="operator">=</span> get_playlist(list_id);</span><br><span class="line">        System.out.println(<span class="string">&quot;音乐列表：&quot;</span> + playlist);</span><br><span class="line"></span><br><span class="line">        obj = JSONObject.parseObject(playlist);</span><br><span class="line">        Array = obj.getJSONArray(<span class="string">&quot;tracks&quot;</span>);</span><br><span class="line">        jsonArray = <span class="keyword">new</span> <span class="title class_">JSONArray</span>(Array);</span><br><span class="line">        listint = (<span class="type">int</span>) (Math.random() * jsonArray.toArray().length);</span><br><span class="line">        obj1 = jsonArray.getJSONObject(listint);</span><br><span class="line">        <span class="type">String</span> <span class="variable">music_id</span> <span class="operator">=</span> obj1.getString(<span class="string">&quot;vid&quot;</span>);</span><br><span class="line">        System.out.println(<span class="string">&quot;音乐ID：&quot;</span> + music_id);</span><br><span class="line">        <span class="comment">/*得到这个id就等于结束了，不要从音乐列表去获取音乐的url，我测试是不行无法播放，具体原因懒得研究了。这里直接用抖音的万能解析接口</span></span><br><span class="line"><span class="comment">        https://www.douyin.com/aweme/v1/play/?video_id=这里输入上面获取的音乐ID&amp;line=0&amp;is_play_url=1&amp;source=PackSourceEnum_PUBLISH</span></span><br><span class="line"><span class="comment">        请求后即可获得播放地址，会员音乐也是可以获取到的，目前全程无任何加密！</span></span><br><span class="line"><span class="comment">        * */</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="结束"><a href="#结束" class="headerlink" title="结束"></a>结束</h1><div class="img-wrap"><div class="img-bg"><img class="img" src="/img/coke.png"/></div></div>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;收集了那么多音乐api不差这一个了&lt;/li&gt;
&lt;li&gt;这个播放器的音乐都是网红歌曲，主要为了获取榜单排行榜音乐&lt;/li&gt;
&lt;li</summary>
      
    
    
    
    <category term="java" scheme="https://www.app966.cn/categories/java/"/>
    
    
    <category term="java" scheme="https://www.app966.cn/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>酷狗signature值计算</title>
    <link href="https://www.app966.cn/post/b64a97e4.html"/>
    <id>https://www.app966.cn/post/b64a97e4.html</id>
    <published>2022-07-28T17:40:03.000Z</published>
    <updated>2023-01-26T12:46:36.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><ul><li>无聊的一天</li></ul><ol><li>想下载一个高清的MV，下载完了顺带<a href="/video/">分享一下</a>吧</li><li>这次是用易语言写的代码</li></ol><ul><li>过程</li></ul><ol><li>url去除“?”左边的然后按a-z排序</li><li>排序完并拼接上前后各加上“OIlwieks28dk2k092lksi2UIkp”然后md5</li><li>这个方式让我想起了角落里的快手，不能说毫不相干，只能说一模一样</li></ol><h1 id="开始"><a href="#开始" class="headerlink" title="开始"></a>开始</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">.版本 2</span><br><span class="line">.支持库 spec</span><br><span class="line"></span><br><span class="line">.程序集 程序集1</span><br><span class="line"></span><br><span class="line">.子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码</span><br><span class="line"></span><br><span class="line">&#x27; kg_ (“说爱你”, 2)</span><br><span class="line">kg_mv (“DA546EF394077B690902C58F858CAAE1”)</span><br><span class="line">返回 (0)  &#x27; 返回值被忽略。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">.子程序 kg_mvhash, 文本型, , 获取高清MV</span><br><span class="line">.参数 mvid, 文本型</span><br><span class="line">.局部变量 http, 类_POST数据类</span><br><span class="line">.局部变量 ret, 文本型</span><br><span class="line">.局部变量 URL, 文本型</span><br><span class="line">.局部变量 data, 文本型</span><br><span class="line">.局部变量 signature, 文本型</span><br><span class="line"></span><br><span class="line">URL ＝ “https://gateway.kugou.com/openapi/kmr/v1/mv?srcappid=2919&amp;clientver=20000&amp;clienttime=” ＋ 时间_取现行时间戳 () ＋ “&amp;mid=b8d5700894e7d861d6859c2513d20808&amp;uuid=b8d5700894e7d861d6859c2513d20808&amp;dfid=4XSSn60jHVzu4IUffL0uxRKB&amp;appid=1014&amp;token=&amp;userid=0”</span><br><span class="line">signature ＝ kg_signature (URL, 真)</span><br><span class="line">URL ＝ URL ＋ “&amp;signature=” ＋ signature</span><br><span class="line">http.添加 (“User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36”)</span><br><span class="line">http.添加 (“Host”, “gateway.kugou.com”)</span><br><span class="line">http.添加 (“KG-TID”, “317”)</span><br><span class="line">data ＝ “&#123;” ＋ #引号 ＋ “fields” ＋ #引号 ＋ “:” ＋ #引号 ＋ “base,h264” ＋ #引号 ＋ “,” ＋ #引号 ＋ “data” ＋ #引号 ＋ “:[&#123;” ＋ #引号 ＋ “entity_id” ＋ #引号 ＋ “:” ＋ #引号 ＋ “224394” ＋ #引号 ＋ “&#125;]&#125;”</span><br><span class="line">ret ＝ 编码_Utf8到Ansi (网页_访问_对象 (URL, 1, data, , , http.获取协议头数据 ()))</span><br><span class="line">调试输出 (ret)</span><br><span class="line">返回 (ret)</span><br><span class="line"></span><br><span class="line">.子程序 kg_mv</span><br><span class="line">.参数 hash, 文本型</span><br><span class="line">.局部变量 http, 类_POST数据类</span><br><span class="line">.局部变量 ret, 文本型</span><br><span class="line">.局部变量 URL, 文本型</span><br><span class="line"></span><br><span class="line">URL ＝ “http://trackermvretry.kugou.com/interface/index?cmd=104&amp;pid=2&amp;ext=mp4&amp;hash=” ＋ 到小写 (hash) ＋ “&amp;jump=0&amp;key=&amp;backupdomain=1”</span><br><span class="line">http.添加 (“User-Agent”, “Android9-AndroidPhone-11239-18-0-SearchAll-wifi”)</span><br><span class="line">http.添加 (“Host”, “trackermvretry.kugou.com”)</span><br><span class="line">ret ＝ 编码_Utf8到Ansi (网页_访问_对象 (URL, , , , , http.获取协议头数据 ()))</span><br><span class="line">调试输出 (ret)</span><br><span class="line"></span><br><span class="line">.子程序 kg_, , , 搜索</span><br><span class="line">.参数 music_name, 文本型</span><br><span class="line">.参数 type, 整数型, 可空, 搜索类型0=综合，1=歌曲，2=MV，默认0</span><br><span class="line">.局部变量 url, 文本型</span><br><span class="line">.局部变量 time, 文本型</span><br><span class="line">.局部变量 signature, 文本型</span><br><span class="line">.局部变量 http, 类_POST数据类</span><br><span class="line">.局部变量 ret, 文本型</span><br><span class="line"></span><br><span class="line">time ＝ 时间_取现行时间戳 (真)</span><br><span class="line">.判断开始 (type ＝ 0)</span><br><span class="line">    url ＝ “http://complexsearchretry.kugou.com/v8/search/complex?osversion=9&amp;userid=0&amp;area_code=1&amp;appid=1005&amp;phonemodel=MI%206X&amp;cursor=1&amp;token=&amp;requestid=925ba516f22071755f5394f23820d25e_5&amp;clienttime=” ＋ time ＋ “&amp;iscorrection=1&amp;uuid=d74ecbf808b72947c91d7b134823a705&amp;apiver=20&amp;keyword=” ＋ 编码_URL编码 (music_name, 真, 真) ＋ “&amp;mid=” ＋ 文本_取随机数字 (38) ＋ “&amp;dfid=-&amp;clientver=11239&amp;platform=AndroidFilter&amp;tag=em”</span><br><span class="line">.判断 (type ＝ 1)</span><br><span class="line">    url ＝ “http://complexsearchretry.kugou.com/v2/search/song?userid=0&amp;area_code=1&amp;appid=1005&amp;dopicfull=1&amp;page=1&amp;token=&amp;privilegefilter=0&amp;requestid=925ba516f22071755f5394f23820d25e_1&amp;pagesize=30&amp;clienttime=” ＋ time ＋ “&amp;sec_aggre=1&amp;iscorrection=1&amp;uuid=d74ecbf808b72947c91d7b134823a705&amp;keyword=” ＋ 编码_URL编码 (music_name, 真, 真) ＋ “&amp;mid=” ＋ 文本_取随机数字 (38) ＋ “&amp;dfid=-&amp;clientver=11239&amp;platform=AndroidFilter&amp;tag=em”</span><br><span class="line">.默认</span><br><span class="line">    url ＝ “http://complexsearchretry.kugou.com/v1/search/mv?sorttype=0&amp;userid=0&amp;tagtype=%E5%85%A8%E9%83%A8&amp;appid=1005&amp;dopicfull=1&amp;page=1&amp;token=&amp;requestid=925ba516f22071755f5394f23820d25e_1&amp;pagesize=20&amp;clienttime=” ＋ time ＋ “&amp;iscorrection=1&amp;uuid=d74ecbf808b72947c91d7b134823a705&amp;keyword=” ＋ 编码_URL编码 (music_name, 真, 真) ＋ “&amp;mid=” ＋ 文本_取随机数字 (38) ＋ “&amp;dfid=-&amp;tagaggr=1&amp;clientver=11239&amp;platform=AndroidFilter&amp;tag=em”</span><br><span class="line">.判断结束</span><br><span class="line">signature ＝ kg_signature (url)</span><br><span class="line">url ＝ url ＋ “&amp;signature=” ＋ signature</span><br><span class="line">http.添加 (“User-Agent”, “Android9-AndroidPhone-11239-18-0-SearchAll-wifi”)</span><br><span class="line">http.添加 (“Host”, “complexsearchretry.kugou.com”)</span><br><span class="line">ret ＝ 编码_Utf8到Ansi (网页_访问_对象 (url, , , , , http.获取协议头数据 ()))</span><br><span class="line">调试输出 (ret)</span><br><span class="line">置剪辑板文本 (ret)</span><br><span class="line"></span><br><span class="line">.子程序 kg_signature, 文本型</span><br><span class="line">.参数 url, 文本型</span><br><span class="line">.参数 web, 逻辑型, 可空, 默认app</span><br><span class="line">.局部变量 text, 文本型</span><br><span class="line">.局部变量 a, 整数型</span><br><span class="line">.局部变量 arr, 文本型, , &quot;0&quot;</span><br><span class="line">.局部变量 i, 整数型</span><br><span class="line">.局部变量 ret, 文本型</span><br><span class="line">.局部变量 res, 文本型</span><br><span class="line">.局部变量 js, 类_脚本组件</span><br><span class="line"></span><br><span class="line">text ＝ 文本_取右边 (url, “?”)</span><br><span class="line">a ＝ 文本_分割文本 (text, “&amp;”, , arr)</span><br><span class="line">.如果真 (a ＝ 0)</span><br><span class="line">    返回 (“0”)</span><br><span class="line">.如果真结束</span><br><span class="line">数组_排序 (arr)</span><br><span class="line">ret ＝ “”</span><br><span class="line">.计次循环首 (a, i)</span><br><span class="line">    ret ＝ ret ＋ arr [i]</span><br><span class="line">.计次循环尾 ()</span><br><span class="line"></span><br><span class="line">.判断开始 (web ＝ 假)</span><br><span class="line">    res ＝ 校验_取md5_文本 (“OIlwieks28dk2k092lksi2UIkp” ＋ 编码_URL解码 (ret, 真) ＋ “OIlwieks28dk2k092lksi2UIkp”, 真)</span><br><span class="line">.默认</span><br><span class="line"></span><br><span class="line">    调试输出 (js.执行 (#js))</span><br><span class="line">    res ＝ “NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt” ＋ ret ＋ “NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt”</span><br><span class="line">    res ＝ js.运行 (“get_md5”, res)</span><br><span class="line">.判断结束</span><br><span class="line">调试输出 (res)</span><br><span class="line">返回 (res)</span><br></pre></td></tr></table></figure><h1 id="结束"><a href="#结束" class="headerlink" title="结束"></a>结束</h1><div class="img-wrap"><div class="img-bg"><img class="img" src="/img/kg.png"/></div></div>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;无聊的一天&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;想下载一个高清的MV，下载完了顺带&lt;a href=&quot;/video/&quot;&gt;分享一</summary>
      
    
    
    
    <category term="易语言" scheme="https://www.app966.cn/categories/%E6%98%93%E8%AF%AD%E8%A8%80/"/>
    
    
    <category term="易语言" scheme="https://www.app966.cn/tags/%E6%98%93%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>Butterfly博客文章统计图详细教程</title>
    <link href="https://www.app966.cn/post/2e3b06de.html"/>
    <id>https://www.app966.cn/post/2e3b06de.html</id>
    <published>2022-07-25T22:46:06.000Z</published>
    <updated>2023-01-26T12:46:36.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><ul><li>Q: 这么多教程为啥还要写这个呢？</li><li>A：主要是因为他有坑（逼死强迫症的那种），安装过程可以转到<a href="https://blog.eurkon.com/post/1213ef82.html">Eurkon</a>的博客，当然我这里也会写</li></ul><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><h2 id="新建-charts-页面"><a href="#新建-charts-页面" class="headerlink" title="新建 charts 页面"></a>新建 charts 页面</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">hexo new page charts</span><br></pre></td></tr></table></figure><h2 id="引入-ECharts-js"><a href="#引入-ECharts-js" class="headerlink" title="引入 ECharts.js"></a>引入 ECharts.js</h2><ul><li>修改主题下的<code>_config.yml</code>文件，在inject 配置项中引入<code>echart.js</code>文件，注意必须放在第一个。</li></ul><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;https://npm.elemecdn.com/echarts@4.9.0/dist/echarts.min.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><h2 id="文章统计代码"><a href="#文章统计代码" class="headerlink" title="文章统计代码"></a>文章统计代码</h2><ul><li>在主题下的<code>/scripts/helpers/</code>目录下新建<code>charts.js</code>文件。</li></ul><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> cheerio = <span class="built_in">require</span>(<span class="string">&#x27;cheerio&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> moment = <span class="built_in">require</span>(<span class="string">&#x27;moment&#x27;</span>)</span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">filter</span>.<span class="title function_">register</span>(<span class="string">&#x27;after_render:html&#x27;</span>, <span class="keyword">function</span> (<span class="params">locals</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> $ = cheerio.<span class="title function_">load</span>(locals)</span><br><span class="line">  <span class="keyword">const</span> post = $(<span class="string">&#x27;#posts-chart&#x27;</span>)</span><br><span class="line">  <span class="keyword">const</span> tag = $(<span class="string">&#x27;#tags-chart&#x27;</span>)</span><br><span class="line">  <span class="keyword">const</span> category = $(<span class="string">&#x27;#categories-chart&#x27;</span>)</span><br><span class="line">  <span class="keyword">const</span> htmlEncode = <span class="literal">false</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (post.<span class="property">length</span> &gt; <span class="number">0</span> || tag.<span class="property">length</span> &gt; <span class="number">0</span> || category.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (post.<span class="property">length</span> &gt; <span class="number">0</span> &amp;&amp; $(<span class="string">&#x27;#postsChart&#x27;</span>).<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      <span class="keyword">if</span> (post.<span class="title function_">attr</span>(<span class="string">&#x27;data-encode&#x27;</span>) === <span class="string">&#x27;true&#x27;</span>) htmlEncode = <span class="literal">true</span></span><br><span class="line">      post.<span class="title function_">after</span>(<span class="title function_">postsChart</span>(post.<span class="title function_">attr</span>(<span class="string">&#x27;data-start&#x27;</span>)))</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (tag.<span class="property">length</span> &gt; <span class="number">0</span> &amp;&amp; $(<span class="string">&#x27;#tagsChart&#x27;</span>).<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      <span class="keyword">if</span> (tag.<span class="title function_">attr</span>(<span class="string">&#x27;data-encode&#x27;</span>) === <span class="string">&#x27;true&#x27;</span>) htmlEncode = <span class="literal">true</span></span><br><span class="line">      tag.<span class="title function_">after</span>(<span class="title function_">tagsChart</span>(tag.<span class="title function_">attr</span>(<span class="string">&#x27;data-length&#x27;</span>)))</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (category.<span class="property">length</span> &gt; <span class="number">0</span> &amp;&amp; $(<span class="string">&#x27;#categoriesChart&#x27;</span>).<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      <span class="keyword">if</span> (category.<span class="title function_">attr</span>(<span class="string">&#x27;data-encode&#x27;</span>) === <span class="string">&#x27;true&#x27;</span>) htmlEncode = <span class="literal">true</span></span><br><span class="line">      category.<span class="title function_">after</span>(<span class="title function_">categoriesChart</span>())</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (htmlEncode) &#123;</span><br><span class="line">      <span class="keyword">return</span> $.<span class="title function_">root</span>().<span class="title function_">html</span>().<span class="title function_">replace</span>(<span class="regexp">/&amp;amp;#/g</span>, <span class="string">&#x27;&amp;#&#x27;</span>)</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      <span class="keyword">return</span> $.<span class="title function_">root</span>().<span class="title function_">html</span>()</span><br><span class="line">    &#125;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> locals</span><br><span class="line">  &#125;</span><br><span class="line">&#125;, <span class="number">15</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">postsChart</span> (startMonth) &#123;</span><br><span class="line">  <span class="keyword">const</span> startDate = <span class="title function_">moment</span>(startMonth || <span class="string">&#x27;2022-04&#x27;</span>)</span><br><span class="line">  <span class="keyword">const</span> endDate = <span class="title function_">moment</span>()</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> monthMap = <span class="keyword">new</span> <span class="title class_">Map</span>()</span><br><span class="line">  <span class="keyword">const</span> dayTime = <span class="number">3600</span> * <span class="number">24</span> * <span class="number">1000</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> time = startDate; time &lt;= endDate; time += dayTime) &#123;</span><br><span class="line">    <span class="keyword">const</span> month = <span class="title function_">moment</span>(time).<span class="title function_">format</span>(<span class="string">&#x27;YYYY-MM&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> (!monthMap.<span class="title function_">has</span>(month)) &#123;</span><br><span class="line">      monthMap.<span class="title function_">set</span>(month, <span class="number">0</span>)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  hexo.<span class="property">locals</span>.<span class="title function_">get</span>(<span class="string">&#x27;posts&#x27;</span>).<span class="title function_">forEach</span>(<span class="keyword">function</span> (<span class="params">post</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> month = post.<span class="property">date</span>.<span class="title function_">format</span>(<span class="string">&#x27;YYYY-MM&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> (monthMap.<span class="title function_">has</span>(month)) &#123;</span><br><span class="line">      monthMap.<span class="title function_">set</span>(month, monthMap.<span class="title function_">get</span>(month) + <span class="number">1</span>)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;)</span><br><span class="line">  <span class="keyword">const</span> monthArr = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>([...monthMap.<span class="title function_">keys</span>()])</span><br><span class="line">  <span class="keyword">const</span> monthValueArr = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>([...monthMap.<span class="title function_">values</span>()])</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="string">`</span></span><br><span class="line"><span class="string">  &lt;script id=&quot;postsChart&quot;&gt;</span></span><br><span class="line"><span class="string">    var color = document.documentElement.getAttribute(&#x27;data-theme&#x27;) === &#x27;light&#x27; ? &#x27;#4c4948&#x27; : &#x27;rgba(255,255,255,0.7)&#x27;</span></span><br><span class="line"><span class="string">    var postsChart = echarts.init(document.getElementById(&#x27;posts-chart&#x27;), &#x27;light&#x27;);</span></span><br><span class="line"><span class="string">    var postsOption = &#123;</span></span><br><span class="line"><span class="string">      title: &#123;</span></span><br><span class="line"><span class="string">        text: &#x27;文章发布统计图&#x27;,</span></span><br><span class="line"><span class="string">        x: &#x27;center&#x27;,</span></span><br><span class="line"><span class="string">        textStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      tooltip: &#123;</span></span><br><span class="line"><span class="string">        trigger: &#x27;axis&#x27;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      xAxis: &#123;</span></span><br><span class="line"><span class="string">        name: &#x27;&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;category&#x27;,</span></span><br><span class="line"><span class="string">        boundaryGap: false,</span></span><br><span class="line"><span class="string">        nameTextStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisTick: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLabel: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          color: color,</span></span><br><span class="line"><span class="string">          interval: 0,</span></span><br><span class="line"><span class="string">          rotate: 0</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLine: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          lineStyle: &#123;</span></span><br><span class="line"><span class="string">            color: color</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;monthArr&#125;</span></span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      yAxis: &#123;</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;value&#x27;,</span></span><br><span class="line"><span class="string">        nameTextStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        splitLine: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisTick: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLabel: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLine: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          lineStyle: &#123;</span></span><br><span class="line"><span class="string">            color: color</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      series: [&#123;</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;line&#x27;,</span></span><br><span class="line"><span class="string">        smooth: true,</span></span><br><span class="line"><span class="string">        lineStyle: &#123;</span></span><br><span class="line"><span class="string">            width: 0</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        showSymbol: false,</span></span><br><span class="line"><span class="string">        itemStyle: &#123;</span></span><br><span class="line"><span class="string">          opacity: 1,</span></span><br><span class="line"><span class="string">          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [&#123;</span></span><br><span class="line"><span class="string">            offset: 0,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(128, 255, 165)&#x27;</span></span><br><span class="line"><span class="string">          &#125;,</span></span><br><span class="line"><span class="string">          &#123;</span></span><br><span class="line"><span class="string">            offset: 1,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(1, 191, 236)&#x27;</span></span><br><span class="line"><span class="string">          &#125;])</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        areaStyle: &#123;</span></span><br><span class="line"><span class="string">          opacity: 1,</span></span><br><span class="line"><span class="string">          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [&#123;</span></span><br><span class="line"><span class="string">            offset: 0,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(128, 255, 165)&#x27;</span></span><br><span class="line"><span class="string">          &#125;, &#123;</span></span><br><span class="line"><span class="string">            offset: 1,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(1, 191, 236)&#x27;</span></span><br><span class="line"><span class="string">          &#125;])</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;monthValueArr&#125;</span>,</span></span><br><span class="line"><span class="string">        markLine: &#123;</span></span><br><span class="line"><span class="string">          data: [&#123;</span></span><br><span class="line"><span class="string">            name: &#x27;平均值&#x27;,</span></span><br><span class="line"><span class="string">            type: &#x27;average&#x27;,</span></span><br><span class="line"><span class="string">            label: &#123;</span></span><br><span class="line"><span class="string">              color: color</span></span><br><span class="line"><span class="string">            &#125;</span></span><br><span class="line"><span class="string">          &#125;]</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;]</span></span><br><span class="line"><span class="string">    &#125;;</span></span><br><span class="line"><span class="string">    postsChart.setOption(postsOption);</span></span><br><span class="line"><span class="string">    setpRotate();</span></span><br><span class="line"><span class="string">    window.addEventListener(&#x27;resize&#x27;, () =&gt; &#123; </span></span><br><span class="line"><span class="string">      setpRotate();</span></span><br><span class="line"><span class="string">      postsChart.resize();</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string">    function setpRotate() &#123;</span></span><br><span class="line"><span class="string">      let postsOptionNew = postsOption</span></span><br><span class="line"><span class="string">      if (document.body.clientWidth&lt;=768) &#123;</span></span><br><span class="line"><span class="string">        postsOptionNew.xAxis.axisLabel.rotate = 40</span></span><br><span class="line"><span class="string">      &#125;else&#123;</span></span><br><span class="line"><span class="string">        postsOptionNew.xAxis.axisLabel.rotate = 0</span></span><br><span class="line"><span class="string">      &#125;</span></span><br><span class="line"><span class="string">      postsChart.setOption(postsOptionNew)</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">  &lt;/script&gt;`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">tagsChart</span> (len) &#123;</span><br><span class="line">  <span class="keyword">const</span> tagArr = []</span><br><span class="line">  hexo.<span class="property">locals</span>.<span class="title function_">get</span>(<span class="string">&#x27;tags&#x27;</span>).<span class="title function_">map</span>(<span class="keyword">function</span> (<span class="params">tag</span>) &#123;</span><br><span class="line">    tagArr.<span class="title function_">push</span>(&#123; <span class="attr">name</span>: tag.<span class="property">name</span>, <span class="attr">value</span>: tag.<span class="property">length</span> &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">  tagArr.<span class="title function_">sort</span>(<span class="function">(<span class="params">a, b</span>) =&gt;</span> &#123; <span class="keyword">return</span> b.<span class="property">value</span> - a.<span class="property">value</span> &#125;)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> dataLength = <span class="title class_">Math</span>.<span class="title function_">min</span>(tagArr.<span class="property">length</span>, len) || tagArr.<span class="property">length</span></span><br><span class="line">  <span class="keyword">const</span> tagNameArr = []</span><br><span class="line">  <span class="keyword">const</span> tagCountArr = []</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; dataLength; i++) &#123;</span><br><span class="line">    tagNameArr.<span class="title function_">push</span>(tagArr[i].<span class="property">name</span>)</span><br><span class="line">    tagCountArr.<span class="title function_">push</span>(tagArr[i].<span class="property">value</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">const</span> tagNameArrJson = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(tagNameArr)</span><br><span class="line">  <span class="keyword">const</span> tagCountArrJson = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(tagCountArr)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="string">`</span></span><br><span class="line"><span class="string">  &lt;script id=&quot;tagsChart&quot;&gt;</span></span><br><span class="line"><span class="string">    var color = document.documentElement.getAttribute(&#x27;data-theme&#x27;) === &#x27;light&#x27; ? &#x27;#4c4948&#x27; : &#x27;rgba(255,255,255,0.7)&#x27;</span></span><br><span class="line"><span class="string">    var tagsChart = echarts.init(document.getElementById(&#x27;tags-chart&#x27;), &#x27;light&#x27;);</span></span><br><span class="line"><span class="string">    var tagsOption = &#123;</span></span><br><span class="line"><span class="string">      title: &#123;</span></span><br><span class="line"><span class="string">        text: &#x27;Top <span class="subst">$&#123;dataLength&#125;</span> 标签统计图&#x27;,</span></span><br><span class="line"><span class="string">        x: &#x27;center&#x27;,</span></span><br><span class="line"><span class="string">        textStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      tooltip: &#123;&#125;,</span></span><br><span class="line"><span class="string">      xAxis: &#123;</span></span><br><span class="line"><span class="string">        name: &#x27;&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;category&#x27;,</span></span><br><span class="line"><span class="string">        nameTextStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisTick: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLabel: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          color: color,</span></span><br><span class="line"><span class="string">          interval: 0</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLine: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          lineStyle: &#123;</span></span><br><span class="line"><span class="string">            color: color</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;tagNameArrJson&#125;</span></span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      yAxis: &#123;</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;value&#x27;,</span></span><br><span class="line"><span class="string">        splitLine: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        nameTextStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisTick: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLabel: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLine: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          lineStyle: &#123;</span></span><br><span class="line"><span class="string">            color: color</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      series: [&#123;</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;bar&#x27;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;tagCountArrJson&#125;</span>,</span></span><br><span class="line"><span class="string">        itemStyle: &#123;</span></span><br><span class="line"><span class="string">          borderRadius: [5, 5, 0, 0],</span></span><br><span class="line"><span class="string">          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [&#123;</span></span><br><span class="line"><span class="string">            offset: 0,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(128, 255, 165)&#x27;</span></span><br><span class="line"><span class="string">          &#125;,</span></span><br><span class="line"><span class="string">          &#123;</span></span><br><span class="line"><span class="string">            offset: 1,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(1, 191, 236)&#x27;</span></span><br><span class="line"><span class="string">          &#125;])</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        emphasis: &#123;</span></span><br><span class="line"><span class="string">          itemStyle: &#123;</span></span><br><span class="line"><span class="string">            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [&#123;</span></span><br><span class="line"><span class="string">              offset: 0,</span></span><br><span class="line"><span class="string">              color: &#x27;rgba(128, 255, 195)&#x27;</span></span><br><span class="line"><span class="string">            &#125;,</span></span><br><span class="line"><span class="string">            &#123;</span></span><br><span class="line"><span class="string">              offset: 1,</span></span><br><span class="line"><span class="string">              color: &#x27;rgba(1, 211, 255)&#x27;</span></span><br><span class="line"><span class="string">            &#125;])</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        markLine: &#123;</span></span><br><span class="line"><span class="string">          data: [&#123;</span></span><br><span class="line"><span class="string">            name: &#x27;平均值&#x27;,</span></span><br><span class="line"><span class="string">            type: &#x27;average&#x27;,</span></span><br><span class="line"><span class="string">            label: &#123;</span></span><br><span class="line"><span class="string">              color: color</span></span><br><span class="line"><span class="string">            &#125;</span></span><br><span class="line"><span class="string">          &#125;]</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;]</span></span><br><span class="line"><span class="string">    &#125;;</span></span><br><span class="line"><span class="string">    tagsChart.setOption(tagsOption);</span></span><br><span class="line"><span class="string">    setRotate();</span></span><br><span class="line"><span class="string">    window.addEventListener(&#x27;resize&#x27;, () =&gt; &#123; </span></span><br><span class="line"><span class="string">      setRotate();</span></span><br><span class="line"><span class="string">      tagsChart.resize();</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string">    function setRotate() &#123;</span></span><br><span class="line"><span class="string">      let tagsOptionNew = tagsOption</span></span><br><span class="line"><span class="string">      if (document.body.clientWidth&lt;=768) &#123;</span></span><br><span class="line"><span class="string">        tagsOptionNew.xAxis.axisLabel.rotate = -90</span></span><br><span class="line"><span class="string">      &#125;else&#123;</span></span><br><span class="line"><span class="string">        tagsOptionNew.xAxis.axisLabel.rotate = 40</span></span><br><span class="line"><span class="string">      &#125;</span></span><br><span class="line"><span class="string">      tagsChart.setOption(tagsOptionNew)</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    tagsChart.on(&#x27;click&#x27;, &#x27;series&#x27;, (event) =&gt; &#123;</span></span><br><span class="line"><span class="string">      if(event.name != &#x27;平均值&#x27;)&#123;</span></span><br><span class="line"><span class="string">        let href = &#x27;/tags/&#x27; + event.name + &#x27;/&#x27;;</span></span><br><span class="line"><span class="string">        window.location.href = href;</span></span><br><span class="line"><span class="string">      &#125;</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string">  &lt;/script&gt;`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">categoriesChart</span> () &#123;</span><br><span class="line">  <span class="keyword">const</span> categoryArr = []</span><br><span class="line">  hexo.<span class="property">locals</span>.<span class="title function_">get</span>(<span class="string">&#x27;categories&#x27;</span>).<span class="title function_">map</span>(<span class="keyword">function</span> (<span class="params">category</span>) &#123;</span><br><span class="line">    categoryArr.<span class="title function_">push</span>(&#123; <span class="attr">name</span>: category.<span class="property">name</span>, <span class="attr">value</span>: category.<span class="property">length</span> &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">  categoryArr.<span class="title function_">sort</span>(<span class="function">(<span class="params">a, b</span>) =&gt;</span> &#123; <span class="keyword">return</span> b.<span class="property">value</span> - a.<span class="property">value</span> &#125;);</span><br><span class="line">  <span class="keyword">const</span> categoryArrJson = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(categoryArr)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="string">`</span></span><br><span class="line"><span class="string">  &lt;script id=&quot;categoriesChart&quot;&gt;</span></span><br><span class="line"><span class="string">    var color = document.documentElement.getAttribute(&#x27;data-theme&#x27;) === &#x27;light&#x27; ? &#x27;#4c4948&#x27; : &#x27;rgba(255,255,255,0.7)&#x27;</span></span><br><span class="line"><span class="string">    var categoriesChart = echarts.init(document.getElementById(&#x27;categories-chart&#x27;), &#x27;light&#x27;);</span></span><br><span class="line"><span class="string">    var categoriesOption = &#123;</span></span><br><span class="line"><span class="string">      title: &#123;</span></span><br><span class="line"><span class="string">        text: &#x27;文章分类统计图&#x27;,</span></span><br><span class="line"><span class="string">        x: &#x27;center&#x27;,</span></span><br><span class="line"><span class="string">        textStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      legend: &#123;</span></span><br><span class="line"><span class="string">        top: &#x27;bottom&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;scroll&#x27;,</span></span><br><span class="line"><span class="string">        textStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      tooltip: &#123;</span></span><br><span class="line"><span class="string">        trigger: &#x27;item&#x27;,</span></span><br><span class="line"><span class="string">        formatter: &#x27;&#123;a&#125; &lt;br/&gt;&#123;b&#125; : &#123;c&#125; (&#123;d&#125;%)&#x27;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      series: [&#123;</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;pie&#x27;,</span></span><br><span class="line"><span class="string">        radius: [30, 80],</span></span><br><span class="line"><span class="string">        center: [&#x27;50%&#x27;, &#x27;50%&#x27;],</span></span><br><span class="line"><span class="string">        roseType: &#x27;area&#x27;,</span></span><br><span class="line"><span class="string">        label: &#123;</span></span><br><span class="line"><span class="string">          color: color,</span></span><br><span class="line"><span class="string">          formatter: &#x27;&#123;b&#125; : &#123;c&#125; (&#123;d&#125;%)&#x27;</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;categoryArrJson&#125;</span>,</span></span><br><span class="line"><span class="string">        itemStyle: &#123;</span></span><br><span class="line"><span class="string">          emphasis: &#123;</span></span><br><span class="line"><span class="string">            shadowBlur: 10,</span></span><br><span class="line"><span class="string">            shadowOffsetX: 0,</span></span><br><span class="line"><span class="string">            shadowColor: &#x27;rgba(255, 255, 255, 0.5)&#x27;</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;]</span></span><br><span class="line"><span class="string">    &#125;;</span></span><br><span class="line"><span class="string">    categoriesChart.setOption(categoriesOption);</span></span><br><span class="line"><span class="string">    window.addEventListener(&#x27;resize&#x27;, () =&gt; &#123; </span></span><br><span class="line"><span class="string">      categoriesChart.resize();</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string">    categoriesChart.on(&#x27;click&#x27;, &#x27;series&#x27;, (event) =&gt; &#123;</span></span><br><span class="line"><span class="string">      let href = &#x27;/categories/&#x27; + event.name + &#x27;/&#x27;;</span></span><br><span class="line"><span class="string">      window.location.href = href;</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string">  &lt;/script&gt;`</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="使用统计图"><a href="#使用统计图" class="headerlink" title="使用统计图"></a>使用统计图</h2><p>在第一次创建charts的页面下的<code>index.md</code>文件中添加以下内容：</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment">&lt;!-- 文章发布时间统计图 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;posts-chart&quot;</span> <span class="attr">data-start</span>=<span class="string">&quot;2021-01&quot;</span> <span class="attr">style</span>=<span class="string">&quot;border-radius: 8px; height: 300px; padding: 10px;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 文章标签统计图 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;tags-chart&quot;</span> <span class="attr">data-length</span>=<span class="string">&quot;10&quot;</span> <span class="attr">style</span>=<span class="string">&quot;border-radius: 8px; height: 300px; padding: 10px;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 文章分类统计图 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;categories-chart&quot;</span> <span class="attr">style</span>=<span class="string">&quot;border-radius: 8px; height: 300px; padding: 10px;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><h1 id="解决坑"><a href="#解决坑" class="headerlink" title="解决坑"></a>解决坑</h1><h2 id="适配Butterfly主题的明暗模式"><a href="#适配Butterfly主题的明暗模式" class="headerlink" title="适配Butterfly主题的明暗模式"></a>适配Butterfly主题的明暗模式</h2><ul><li>这里就不要看他的教程了因为有坑</li><li>在主题文件下的<code>/source/</code>目录内新建一个自定义js，名字随意，例如我的是 <code>/source/js/app966.js</code>,内容如下：</li></ul><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">switchPostChart</span> () &#123;</span><br><span class="line">  <span class="comment">// 这里为了统一颜色选取的是“明暗模式”下的两种字体颜色，也可以自己定义</span></span><br><span class="line">  <span class="keyword">let</span> color = <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="title function_">getAttribute</span>(<span class="string">&#x27;data-theme&#x27;</span>) === <span class="string">&#x27;light&#x27;</span> ? <span class="string">&#x27;#4c4948&#x27;</span> : <span class="string">&#x27;rgba(255,255,255,0.7)&#x27;</span></span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;posts-chart&#x27;</span>) &amp;&amp; postsOption) &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      <span class="keyword">let</span> postsOptionNew = postsOption</span><br><span class="line">      postsOptionNew.<span class="property">title</span>.<span class="property">textStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      postsOptionNew.<span class="property">xAxis</span>.<span class="property">nameTextStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      postsOptionNew.<span class="property">yAxis</span>.<span class="property">nameTextStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      postsOptionNew.<span class="property">xAxis</span>.<span class="property">axisLabel</span>.<span class="property">color</span> = color</span><br><span class="line">      postsOptionNew.<span class="property">yAxis</span>.<span class="property">axisLabel</span>.<span class="property">color</span> = color</span><br><span class="line">      postsOptionNew.<span class="property">xAxis</span>.<span class="property">axisLine</span>.<span class="property">lineStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      postsOptionNew.<span class="property">yAxis</span>.<span class="property">axisLine</span>.<span class="property">lineStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      postsOptionNew.<span class="property">series</span>[<span class="number">0</span>].<span class="property">markLine</span>.<span class="property">data</span>[<span class="number">0</span>].<span class="property">label</span>.<span class="property">color</span> = color</span><br><span class="line">      postsChart.<span class="title function_">setOption</span>(postsOptionNew)</span><br><span class="line">    &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(error)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;tags-chart&#x27;</span>) &amp;&amp; tagsOption) &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      <span class="keyword">let</span> tagsOptionNew = tagsOption</span><br><span class="line">      tagsOptionNew.<span class="property">title</span>.<span class="property">textStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      tagsOptionNew.<span class="property">xAxis</span>.<span class="property">nameTextStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      tagsOptionNew.<span class="property">yAxis</span>.<span class="property">nameTextStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      tagsOptionNew.<span class="property">xAxis</span>.<span class="property">axisLabel</span>.<span class="property">color</span> = color</span><br><span class="line">      tagsOptionNew.<span class="property">yAxis</span>.<span class="property">axisLabel</span>.<span class="property">color</span> = color</span><br><span class="line">      tagsOptionNew.<span class="property">xAxis</span>.<span class="property">axisLine</span>.<span class="property">lineStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      tagsOptionNew.<span class="property">yAxis</span>.<span class="property">axisLine</span>.<span class="property">lineStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      tagsOptionNew.<span class="property">series</span>[<span class="number">0</span>].<span class="property">markLine</span>.<span class="property">data</span>[<span class="number">0</span>].<span class="property">label</span>.<span class="property">color</span> = color</span><br><span class="line">      tagsChart.<span class="title function_">setOption</span>(tagsOptionNew)</span><br><span class="line">    &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(error)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;categories-chart&#x27;</span>) &amp;&amp; categoriesOption) &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      <span class="keyword">let</span> categoriesOptionNew = categoriesOption</span><br><span class="line">      categoriesOptionNew.<span class="property">title</span>.<span class="property">textStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      categoriesOptionNew.<span class="property">legend</span>.<span class="property">textStyle</span>.<span class="property">color</span> = color</span><br><span class="line">      categoriesOptionNew.<span class="property">series</span>[<span class="number">0</span>].<span class="property">label</span>.<span class="property">color</span> = color</span><br><span class="line">      categoriesChart.<span class="title function_">setOption</span>(categoriesOptionNew)</span><br><span class="line">    &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(error)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;darkmode&quot;</span>).<span class="title function_">addEventListener</span>(<span class="string">&quot;click&quot;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123; <span class="built_in">setTimeout</span>(switchPostChart, <span class="number">100</span>) &#125;)</span><br></pre></td></tr></table></figure><h2 id="引入自定义的js"><a href="#引入自定义的js" class="headerlink" title="引入自定义的js"></a>引入自定义的js</h2><ul><li>修改主题下的<code>_config.yml</code>文件，在inject 配置项中引入<code>app966.js</code>文件。</li><li>注意事项：如果你在主题的<code>_config.yml</code>文件中打开了<code>pjax</code>务必使用<code>defer data-pjax</code>引入，否则<code>defer</code>即可；</li><li>否则会导致每次都要刷新才正常切换。</li></ul><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">  <span class="attr">bottom:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">defer</span> <span class="string">data-pjax</span> <span class="string">src=&quot;/js/app966.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><h2 id="点击平均值跳404的问题"><a href="#点击平均值跳404的问题" class="headerlink" title="点击平均值跳404的问题"></a>点击平均值跳404的问题</h2><ul><li>如果你用的我上面的<code>文章统计代码</code>则可跳过此处。</li><li>删除文章统计代码第<code>281-282行</code>，添加下面代码覆盖即可。</li><li>否则会导致跳转404的问题。</li></ul><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">if</span>(event.<span class="property">name</span> != <span class="string">&#x27;平均值&#x27;</span>)&#123;</span><br><span class="line">        <span class="keyword">let</span> href = <span class="string">&#x27;/tags/&#x27;</span> + event.<span class="property">name</span> + <span class="string">&#x27;/&#x27;</span>;</span><br><span class="line">        <span class="variable language_">window</span>.<span class="property">location</span>.<span class="property">href</span> = href;</span><br><span class="line">      &#125;</span><br></pre></td></tr></table></figure><h2 id="解决标签统计图问题"><a href="#解决标签统计图问题" class="headerlink" title="解决标签统计图问题"></a>解决标签统计图问题</h2><ul><li>如果你用的我上面的<code>文章统计代码</code>则可跳过此处。</li><li>在js代码中找到<code>标签统计图</code>下面的<code>axisLabel</code>，新增下面内容。</li><li>否则会导致标签统计图默认不显示所有标签文字的问题。</li></ul><figure class="highlight diff"><table><tr><td class="code"><pre><span class="line">        axisLabel: &#123;</span><br><span class="line">          show: true,</span><br><span class="line">          color: color,</span><br><span class="line"><span class="addition">+         interval: 0</span></span><br></pre></td></tr></table></figure><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><ul><li>以上步骤完毕后在博客根目录运行</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">hexo clean &amp;&amp; hexo g</span><br></pre></td></tr></table></figure><ul><li>结果当然肯定是报错拉，因为你没有安装<code>EChart</code>模块，继续运行</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">npm install echarts --save</span><br></pre></td></tr></table></figure><ul><li>至此，所有问题都已完美解决！<a href="/charts/">看看成品效果</a></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;Q: 这么多教程为啥还要写这个呢？&lt;/li&gt;
&lt;li&gt;A：主要是因为他有坑（逼死强迫症的那种），安装过程可以转到&lt;a href=</summary>
      
    
    
    
    <category term="Butterfly" scheme="https://www.app966.cn/categories/Butterfly/"/>
    
    
    <category term="Butterfly" scheme="https://www.app966.cn/tags/Butterfly/"/>
    
    <category term="教程" scheme="https://www.app966.cn/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>onebot2插件源码</title>
    <link href="https://www.app966.cn/post/2134719b.html"/>
    <id>https://www.app966.cn/post/2134719b.html</id>
    <published>2022-07-12T13:47:20.000Z</published>
    <updated>2023-04-21T02:33:30.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><div class="tip bell faa-horizontal animated"><p>注意插件的版本号，有新版本我会同步更新</p></div><div class="tip bolt faa-horizontal animated"><p>公开一些自己写的插件源码，有需要的复制到你的项目中即可</p></div><h1 id="群管系统"><a href="#群管系统" class="headerlink" title="群管系统"></a>群管系统</h1><ul><li>防撤回已经并入群管系统</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/7/11 01:13</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : group_recall.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="keyword">import</span> aiofiles</span><br><span class="line"><span class="keyword">from</span> asyncio <span class="keyword">import</span> sleep <span class="keyword">as</span> asleep</span><br><span class="line"><span class="keyword">from</span> random <span class="keyword">import</span> randint</span><br><span class="line"><span class="keyword">from</span> traceback <span class="keyword">import</span> print_exc</span><br><span class="line"><span class="keyword">from</span> nonebot.matcher <span class="keyword">import</span> Matcher</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_notice, on_message, on_request, on_command</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11.permission <span class="keyword">import</span> GROUP_ADMIN, GROUP_OWNER</span><br><span class="line"><span class="keyword">from</span> nonebot.permission <span class="keyword">import</span> SUPERUSER</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.exception <span class="keyword">import</span> ActionFailed</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11 <span class="keyword">import</span> Bot, NoticeEvent, Message, GroupMessageEvent, GroupRequestEvent</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters <span class="keyword">import</span> Event</span><br><span class="line"><span class="keyword">from</span> .config <span class="keyword">import</span> plugin_config, global_config</span><br><span class="line"><span class="keyword">from</span> .switch <span class="keyword">import</span> load, At, MsgText, Reply</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line">bot_name = <span class="built_in">str</span>(global_config.nickname).split(<span class="string">&quot;&#x27;&quot;</span>)[<span class="number">1</span>] <span class="comment"># 获取设置的机器人名字</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">super</span> = global_config.superusers  <span class="comment"># 超管QQ</span></span><br><span class="line">_path = plugin_config.admin_path</span><br><span class="line">jin_path = plugin_config.jin_path</span><br><span class="line">time_min = plugin_config.ban_rand_time_min</span><br><span class="line">time_max = plugin_config.ban_rand_time_max</span><br><span class="line">group_admin = plugin_config.config_group_admin</span><br><span class="line">answer_list = plugin_config.answer</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;群管系统&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.4&#x27;</span></span><br><span class="line">__usage__ = <span class="string">&#x27;目前支持：\n违禁词检测可自动处罚、加群可以根据答案同意或拒绝、防撤回、禁言、解禁、踢人、拉黑、进群退群提醒、撤回某人n条消息&#x27;</span></span><br><span class="line"></span><br><span class="line">f_word = on_message(priority=<span class="number">2</span>, block=<span class="literal">False</span>)</span><br><span class="line"><span class="meta">@f_word.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">bot: Bot, event: GroupMessageEvent, matcher: Matcher</span>):</span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">with</span> aiofiles.<span class="built_in">open</span>(jin_path, <span class="string">&#x27;r&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        custom_limit_words = <span class="keyword">await</span> f.read()</span><br><span class="line">        <span class="keyword">await</span> f.close()</span><br><span class="line">        mid = event.message_id</span><br><span class="line">        gid = event.group_id</span><br><span class="line">        user_id = event.user_id</span><br><span class="line">        funcs_status = (<span class="keyword">await</span> load(_path))</span><br><span class="line">        <span class="keyword">if</span> funcs_status.get(<span class="built_in">str</span>(gid), <span class="string">&#x27;&#x27;</span>):</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                lf = funcs_status[<span class="built_in">str</span>(gid)][<span class="string">&#x27;违禁词检测&#x27;</span>]</span><br><span class="line">            <span class="keyword">except</span> Exception:</span><br><span class="line">                lf = <span class="literal">False</span></span><br><span class="line">                <span class="keyword">await</span> f_word.finish(<span class="string">&#x27;还未开启违禁词检测的功能，请输入命令&quot;/开关 违禁词检测&quot;控制开关&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> lf:</span><br><span class="line">            set_time = random.randint(time_min, time_max)</span><br><span class="line">            time_string = set_timestring(set_time)</span><br><span class="line">            rules = [re.sub(<span class="string">r&#x27;\t+&#x27;</span>, <span class="string">&#x27;\t&#x27;</span>, rule).split(<span class="string">&#x27;\t&#x27;</span>) <span class="keyword">for</span> rule <span class="keyword">in</span></span><br><span class="line">                 custom_limit_words.split(<span class="string">&#x27;\n&#x27;</span>)]</span><br><span class="line">            msg = re.sub(<span class="string">r&#x27;\s&#x27;</span>, <span class="string">&#x27;&#x27;</span>, <span class="built_in">str</span>(event.get_message()))</span><br><span class="line">            <span class="keyword">for</span> rule <span class="keyword">in</span> rules:</span><br><span class="line">                <span class="keyword">if</span> rule[<span class="number">0</span>] <span class="keyword">and</span> re.search(rule[<span class="number">0</span>], msg):</span><br><span class="line">                    matcher.stop_propagation()</span><br><span class="line">                    <span class="keyword">try</span>:</span><br><span class="line">                        <span class="keyword">await</span> bot.delete_msg(message_id=mid)</span><br><span class="line">                        <span class="keyword">await</span> bot.set_group_ban(group_id=gid, user_id=user_id, duration=set_time)</span><br><span class="line">                    <span class="keyword">except</span> Exception:</span><br><span class="line">                        <span class="keyword">await</span> f_word.finish(at_sender=<span class="literal">True</span>, message=<span class="string">f&#x27;你发送了违禁词，待进行禁言<span class="subst">&#123;time_string&#125;</span>的处罚，请@管理员处理，将本机器人设为管理员可自动撤回加处罚！&#x27;</span>)</span><br><span class="line">                    <span class="keyword">await</span> f_word.finish(at_sender=<span class="literal">True</span>, message=<span class="string">f&#x27;你发送了违禁词，现在进行禁言<span class="subst">&#123;time_string&#125;</span>的处罚，如有异议请联系管理员！&#x27;</span>)</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">group_req = on_request(priority=<span class="number">1</span>)</span><br><span class="line"><span class="meta">@group_req.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">bot: Bot, event: GroupRequestEvent</span>):</span><br><span class="line">    raw = json.loads(event.json())</span><br><span class="line">    gid = <span class="built_in">str</span>(event.group_id)</span><br><span class="line">    flag = raw[<span class="string">&#x27;flag&#x27;</span>]</span><br><span class="line">    sub_type = raw[<span class="string">&#x27;sub_type&#x27;</span>]</span><br><span class="line">    funcs_status = (<span class="keyword">await</span> load(_path))</span><br><span class="line">    <span class="keyword">if</span> funcs_status.get(gid, <span class="string">&#x27;&#x27;</span>):</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            lf = funcs_status[gid][<span class="string">&#x27;加群处理&#x27;</span>]</span><br><span class="line">        <span class="keyword">except</span> Exception:</span><br><span class="line">            lf = <span class="literal">False</span></span><br><span class="line">            <span class="keyword">await</span> group_req.finish(<span class="string">&#x27;还未开启加群处理的功能，请输入命令&quot;/开关 加群处理&quot;控制开关&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> lf:</span><br><span class="line">            comment = raw[<span class="string">&#x27;comment&#x27;</span>]</span><br><span class="line">            comments = str_right(comment, <span class="string">&#x27;答案：&#x27;</span>) <span class="keyword">if</span> <span class="string">&#x27;答案&#x27;</span> <span class="keyword">in</span> comment <span class="keyword">else</span> comment</span><br><span class="line">            uid = event.user_id</span><br><span class="line">            <span class="keyword">if</span> group_admin:</span><br><span class="line">                <span class="keyword">if</span> <span class="built_in">len</span>(comments) &gt; plugin_config.answer_int <span class="keyword">or</span> comments <span class="keyword">in</span> answer_list:</span><br><span class="line">                    <span class="keyword">await</span> bot.set_group_add_request(</span><br><span class="line">                        flag=flag,</span><br><span class="line">                        sub_type=sub_type,</span><br><span class="line">                        approve=<span class="literal">True</span>,</span><br><span class="line">                        reason=<span class="string">&quot;&quot;</span></span><br><span class="line">                    )</span><br><span class="line">                    <span class="keyword">await</span> bot.send_msg(group_id=<span class="built_in">int</span>(gid), message=<span class="string">f&#x27;已同意<span class="subst">&#123;uid&#125;</span>加入本群，验证消息为“<span class="subst">&#123;comment&#125;</span>”&#x27;</span>)</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="keyword">await</span> bot.set_group_add_request(</span><br><span class="line">                        flag=flag,</span><br><span class="line">                        sub_type=sub_type,</span><br><span class="line">                        approve=<span class="literal">False</span>,</span><br><span class="line">                        reason=<span class="string">&quot;因回答不符合本群要求自动拒绝！&quot;</span></span><br><span class="line">                    )</span><br><span class="line">                    <span class="keyword">await</span> bot.send_msg(group_id=<span class="built_in">int</span>(gid), message=<span class="string">f&#x27;因回答不符本群要求，已拒绝<span class="subst">&#123;uid&#125;</span>加入本群，验证消息为“<span class="subst">&#123;comment&#125;</span>”&#x27;</span>)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">await</span> bot.set_group_add_request(</span><br><span class="line">                    flag=flag,</span><br><span class="line">                    sub_type=sub_type,</span><br><span class="line">                    approve=<span class="literal">False</span>,</span><br><span class="line">                    reason=<span class="string">&quot;自动拒绝，如有异议请联系管理重新申请！&quot;</span></span><br><span class="line">                )</span><br><span class="line">                <span class="keyword">await</span> bot.send_msg(group_id=<span class="built_in">int</span>(gid), message=<span class="string">f&#x27;已拒绝<span class="subst">&#123;uid&#125;</span>加入本群，验证消息为“<span class="subst">&#123;comment&#125;</span>”&#x27;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_group_recall</span>(<span class="params">event: NoticeEvent</span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">    <span class="keyword">if</span> event.notice_type == <span class="string">&#x27;group_recall&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">group_recall = on_notice(_group_recall, priority=<span class="number">5</span>)</span><br><span class="line"><span class="meta">@group_recall.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">bot: Bot, event: NoticeEvent</span>):</span><br><span class="line">    event_obj = json.loads(event.json())</span><br><span class="line">    user_id = event_obj[<span class="string">&quot;user_id&quot;</span>]  <span class="comment"># 消息发送者</span></span><br><span class="line">    operator_id = event_obj[<span class="string">&quot;operator_id&quot;</span>]  <span class="comment"># 撤回消息的人</span></span><br><span class="line">    group_id = event_obj[<span class="string">&quot;group_id&quot;</span>]  <span class="comment"># 群号</span></span><br><span class="line">    message_id = event_obj[<span class="string">&quot;message_id&quot;</span>]  <span class="comment"># 消息 id</span></span><br><span class="line">    <span class="comment"># print(user_id, message_id, group_id, operator_id)</span></span><br><span class="line">    <span class="comment"># print(event_obj)</span></span><br><span class="line">    funcs_status = (<span class="keyword">await</span> load(_path))</span><br><span class="line">    <span class="keyword">if</span> funcs_status.get(<span class="built_in">str</span>(group_id), <span class="string">&#x27;&#x27;</span>):</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            lf = funcs_status[<span class="built_in">str</span>(group_id)][<span class="string">&#x27;防撤回&#x27;</span>]</span><br><span class="line">        <span class="keyword">except</span> Exception:</span><br><span class="line">            lf = <span class="literal">False</span></span><br><span class="line">            <span class="keyword">await</span> group_recall.finish(<span class="string">&#x27;还未开启防撤回的功能，请输入命令&quot;/开关 防撤回&quot;控制开关&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> lf:</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">int</span>(user_id) != <span class="built_in">int</span>(operator_id): <span class="keyword">return</span>  <span class="comment"># 撤回人不是发消息人，是管理员撤回成员消息，不处理</span></span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">int</span>(operator_id) <span class="keyword">in</span> <span class="built_in">super</span> <span class="keyword">or</span> <span class="built_in">str</span>(operator_id) <span class="keyword">in</span> <span class="built_in">super</span>: <span class="keyword">return</span>  <span class="comment"># 发起撤回的人是超管，不处理</span></span><br><span class="line">            <span class="comment"># 管理员撤回自己的不处理</span></span><br><span class="line">            operator_info = <span class="keyword">await</span> bot.get_group_member_info(group_id=group_id, user_id=operator_id, no_cache=<span class="literal">True</span>)</span><br><span class="line">            <span class="comment"># print(operator_info)</span></span><br><span class="line">            <span class="keyword">if</span> operator_info[<span class="string">&quot;role&quot;</span>] != <span class="string">&quot;member&quot;</span>: <span class="keyword">return</span></span><br><span class="line">            <span class="comment"># 防撤回</span></span><br><span class="line">            recalled_message = <span class="keyword">await</span> bot.get_msg(message_id=message_id)</span><br><span class="line">            recall_notice = <span class="string">f&quot;检测到<span class="subst">&#123;operator_info[<span class="string">&#x27;card&#x27;</span>] <span class="keyword">if</span> operator_info[<span class="string">&#x27;card&#x27;</span>] <span class="keyword">else</span> operator_info[<span class="string">&#x27;nickname&#x27;</span>]&#125;</span>(<span class="subst">&#123;operator_info[<span class="string">&#x27;user_id&#x27;</span>]&#125;</span>)撤回了一条消息：\n\n&quot;</span></span><br><span class="line">            <span class="keyword">await</span> bot.send_group_msg(group_id=group_id, message=recall_notice + recalled_message[<span class="string">&#x27;message&#x27;</span>])</span><br><span class="line">            <span class="keyword">await</span> group_recall.finish()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">welcom = on_notice(priority=<span class="number">5</span>)</span><br><span class="line"><span class="meta">@welcom.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">event: Event</span>):</span><br><span class="line">    description = event.get_event_description()</span><br><span class="line">    values = json.loads(description.replace(<span class="string">&quot;&#x27;&quot;</span>, <span class="string">&#x27;&quot;&#x27;</span>))</span><br><span class="line">    user_id = values[<span class="string">&#x27;user_id&#x27;</span>]</span><br><span class="line">    group_id = values[<span class="string">&quot;group_id&quot;</span>]</span><br><span class="line">    at_ = <span class="string">&quot;[CQ:at,qq=&#123;0&#125;]&quot;</span>.<span class="built_in">format</span>(user_id)</span><br><span class="line"></span><br><span class="line">    funcs_status = (<span class="keyword">await</span> load(_path))</span><br><span class="line">    <span class="keyword">if</span> funcs_status.get(<span class="built_in">str</span>(group_id), <span class="string">&#x27;&#x27;</span>):</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            lf = funcs_status[<span class="built_in">str</span>(group_id)][<span class="string">&#x27;进退提示&#x27;</span>]</span><br><span class="line">        <span class="keyword">except</span> Exception:</span><br><span class="line">            lf = <span class="literal">False</span></span><br><span class="line">            <span class="keyword">await</span> welcom.finish(<span class="string">&#x27;还未开启进退提示的功能，请输入命令&quot;/开关 进退提示&quot;控制开关&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> lf:</span><br><span class="line">            <span class="keyword">if</span> values[<span class="string">&#x27;notice_type&#x27;</span>] == <span class="string">&#x27;group_increase&#x27;</span>:</span><br><span class="line">                <span class="keyword">try</span>:</span><br><span class="line">                    lfc = funcs_status[<span class="built_in">str</span>(group_id)][<span class="string">&#x27;违禁词检测&#x27;</span>]</span><br><span class="line">                <span class="keyword">except</span> Exception:</span><br><span class="line">                    lfc = <span class="literal">False</span></span><br><span class="line">                we = <span class="string">&#x27;&#x27;</span></span><br><span class="line">                <span class="keyword">if</span> lfc:</span><br><span class="line">                    we = <span class="string">&#x27;\n温馨提示：本群已开启违禁词检测，请注意你的言行！&#x27;</span></span><br><span class="line">                msg = at_ + <span class="string">f&#x27;欢迎入群，我是最可爱的<span class="subst">&#123;bot_name&#125;</span>机器人，有事记得叫我哦!\n输入“/help list”可查看我支持的功能，输入“/开关状态”可查看被动插件开启状态<span class="subst">&#123;we&#125;</span>&#x27;</span></span><br><span class="line">                msg = Message(msg)</span><br><span class="line">                <span class="keyword">await</span> welcom.send(Message(msg))</span><br><span class="line">            <span class="keyword">elif</span> values[<span class="string">&#x27;notice_type&#x27;</span>] == <span class="string">&#x27;group_decrease&#x27;</span>:</span><br><span class="line">                <span class="keyword">if</span> values[<span class="string">&#x27;sub_type&#x27;</span>] == <span class="string">&#x27;leave&#x27;</span>:</span><br><span class="line">                    msg = at_ + <span class="string">&#x27;这位勇士离开了本群，大家快出来送别他吧！&#x27;</span></span><br><span class="line">                    msg = Message(msg)</span><br><span class="line">                    <span class="keyword">await</span> welcom.send(msg)</span><br><span class="line">                <span class="keyword">elif</span> values[<span class="string">&#x27;sub_type&#x27;</span>] == <span class="string">&#x27;kick&#x27;</span>:</span><br><span class="line">                    operator_id = values[<span class="string">&#x27;operator_id&#x27;</span>]</span><br><span class="line">                    su = <span class="string">&quot;[CQ:at,qq=&#123;0&#125;]&quot;</span>.<span class="built_in">format</span>(operator_id)</span><br><span class="line">                    msg = at_ + <span class="string">&#x27;这位勇士被&#x27;</span> + su + <span class="string">&#x27;踢出了本群，大家快出来瞅瞅！&#x27;</span></span><br><span class="line">                    msg = Message(msg)</span><br><span class="line">                    <span class="keyword">await</span> welcom.send(msg)</span><br><span class="line">            <span class="keyword">elif</span> values[<span class="string">&#x27;notice_type&#x27;</span>] == <span class="string">&#x27;notify&#x27;</span>:</span><br><span class="line">                <span class="keyword">if</span> values[<span class="string">&#x27;sub_type&#x27;</span>] == <span class="string">&#x27;poke&#x27;</span>:</span><br><span class="line">                    <span class="keyword">if</span> values[<span class="string">&#x27;target_id&#x27;</span>] == plugin_config.bot_id:</span><br><span class="line">                        <span class="keyword">await</span> welcom.send(<span class="string">f&quot;请尽情吩咐<span class="subst">&#123;bot_name&#125;</span>吧，主人！&quot;</span>)</span><br><span class="line">                <span class="keyword">try</span>:</span><br><span class="line">                    <span class="keyword">if</span> values[<span class="string">&#x27;honor_type&#x27;</span>] == <span class="string">&#x27;talkative&#x27;</span>:</span><br><span class="line">                        msg = <span class="string">&#x27;本群新晋龙王是&#x27;</span> + at_</span><br><span class="line">                        <span class="keyword">await</span> welcom.send(Message(msg))</span><br><span class="line">                    <span class="keyword">elif</span> values[<span class="string">&#x27;honor_type&#x27;</span>] == <span class="string">&#x27;performer&#x27;</span>:</span><br><span class="line">                        msg = <span class="string">&#x27;本群新晋群聊之火是&#x27;</span> + at_</span><br><span class="line">                        <span class="keyword">await</span> welcom.send(Message(msg))</span><br><span class="line">                    <span class="keyword">elif</span> values[<span class="string">&#x27;honor_type&#x27;</span>] == <span class="string">&#x27;emotion&#x27;</span>:</span><br><span class="line">                        msg = <span class="string">&#x27;本群新晋快乐源泉是&#x27;</span> + at_</span><br><span class="line">                        <span class="keyword">await</span> welcom.send(Message(msg))</span><br><span class="line">                <span class="keyword">except</span> KeyError <span class="keyword">as</span> e:</span><br><span class="line">                    <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">banSb</span>(<span class="params">gid: <span class="built_in">int</span>, ban_list: <span class="built_in">list</span>, time: <span class="built_in">int</span> = <span class="literal">None</span>, scope: <span class="built_in">list</span> = <span class="literal">None</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    构造禁言</span></span><br><span class="line"><span class="string">    :param gid: 群号</span></span><br><span class="line"><span class="string">    :param time: 时间（s)</span></span><br><span class="line"><span class="string">    :param ban_list: at列表</span></span><br><span class="line"><span class="string">    :param scope: 用于被动检测禁言的时间范围</span></span><br><span class="line"><span class="string">    :return:禁言操作</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    time_string = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="comment"># if &#x27;all&#x27; in ban_list:</span></span><br><span class="line">    <span class="comment">#     yield nonebot.get_bot().set_group_whole_ban(</span></span><br><span class="line">    <span class="comment">#         group_id=gid,</span></span><br><span class="line">    <span class="comment">#         enable=True</span></span><br><span class="line">    <span class="comment">#     )</span></span><br><span class="line">    <span class="comment"># else:</span></span><br><span class="line">    <span class="keyword">if</span> time <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">        <span class="keyword">if</span> scope <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">            time = random.randint(time_min, time_max)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            time = random.randint(scope[<span class="number">0</span>], scope[<span class="number">1</span>])</span><br><span class="line">        time_string = set_timestring(time)</span><br><span class="line">    <span class="keyword">for</span> qq <span class="keyword">in</span> ban_list:</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">int</span>(qq) <span class="keyword">in</span> <span class="built_in">super</span> <span class="keyword">or</span> <span class="built_in">str</span>(qq) <span class="keyword">in</span> <span class="built_in">super</span>:</span><br><span class="line">            <span class="keyword">await</span> nonebot.get_bot().send_group_msg(group_id=gid, message=<span class="string">&quot;超管无法被禁言&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> time &gt; <span class="number">0</span>:</span><br><span class="line">                <span class="keyword">await</span> nonebot.get_bot().send_group_msg(group_id=gid, message=<span class="string">f&quot;该用户已被禁言<span class="subst">&#123;time_string&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">yield</span> nonebot.get_bot().set_group_ban(</span><br><span class="line">                group_id=gid,</span><br><span class="line">                user_id=qq,</span><br><span class="line">                duration=time,</span><br><span class="line">            )</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">kick = on_command(<span class="string">&#x27;踢&#x27;</span>, permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER, priority=<span class="number">1</span>, block=<span class="literal">True</span>)</span><br><span class="line"><span class="meta">@kick.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">bot: Bot, event: GroupMessageEvent</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    /踢 @user 踢出某人</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    msg = <span class="built_in">str</span>(event.get_message())</span><br><span class="line">    sb = At(event.json())</span><br><span class="line">    gid = event.group_id</span><br><span class="line">    <span class="keyword">if</span> sb:</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&#x27;all&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> sb:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                <span class="keyword">for</span> qq <span class="keyword">in</span> sb:</span><br><span class="line">                    <span class="keyword">await</span> bot.set_group_kick(</span><br><span class="line">                        group_id=gid,</span><br><span class="line">                        user_id=<span class="built_in">int</span>(qq),</span><br><span class="line">                        reject_add_request=<span class="literal">False</span></span><br><span class="line">                    )</span><br><span class="line">            <span class="keyword">except</span> ActionFailed:</span><br><span class="line">                <span class="keyword">await</span> kick.finish(<span class="string">&quot;权限不足&quot;</span>)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">await</span> kick.finish(<span class="string">f&quot;踢人操作成功&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">await</span> kick.finish(<span class="string">&quot;不能含有@全体成员&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">kick_ = on_command(<span class="string">&#x27;黑&#x27;</span>, permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER, priority=<span class="number">1</span>, block=<span class="literal">True</span>)</span><br><span class="line"><span class="meta">@kick_.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">bot: Bot, event: GroupMessageEvent</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    黑 @user 踢出并拉黑某人</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    msg = <span class="built_in">str</span>(event.get_message())</span><br><span class="line">    sb = At(event.json())</span><br><span class="line">    gid = event.group_id</span><br><span class="line">    <span class="keyword">if</span> sb:</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&#x27;all&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> sb:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                <span class="keyword">for</span> qq <span class="keyword">in</span> sb:</span><br><span class="line">                    <span class="keyword">await</span> bot.set_group_kick(</span><br><span class="line">                        group_id=gid,</span><br><span class="line">                        user_id=<span class="built_in">int</span>(qq),</span><br><span class="line">                        reject_add_request=<span class="literal">True</span></span><br><span class="line">                    )</span><br><span class="line">            <span class="keyword">except</span> ActionFailed:</span><br><span class="line">                <span class="keyword">await</span> kick_.finish(<span class="string">&quot;权限不足&quot;</span>)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">await</span> kick_.finish(<span class="string">f&quot;踢人并拉黑操作成功&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">await</span> kick_.finish(<span class="string">&quot;不能含有@全体成员&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ban = on_command(<span class="string">&#x27;禁&#x27;</span>, priority=<span class="number">1</span>, block=<span class="literal">True</span>, permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER)</span><br><span class="line"><span class="meta">@ban.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">bot: Bot, event: GroupMessageEvent</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    /禁 @user 禁言</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        msg = MsgText(event.json()).replace(<span class="string">&quot; &quot;</span>, <span class="string">&quot;&quot;</span>).replace(<span class="string">&quot;禁&quot;</span>, <span class="string">&quot;&quot;</span>)</span><br><span class="line">        time = <span class="built_in">int</span>(<span class="string">&quot;&quot;</span>.join(<span class="built_in">map</span>(<span class="built_in">str</span>, <span class="built_in">list</span>(<span class="built_in">map</span>(<span class="keyword">lambda</span> x: <span class="built_in">int</span>(x), <span class="built_in">filter</span>(<span class="keyword">lambda</span> x: x.isdigit(), msg))))))</span><br><span class="line">        <span class="comment"># 提取消息中所有数字作为禁言时间</span></span><br><span class="line">    <span class="keyword">except</span> ValueError:</span><br><span class="line">        time = <span class="literal">None</span></span><br><span class="line">    sb = At(event.json())</span><br><span class="line">    gid = event.group_id</span><br><span class="line">    <span class="keyword">if</span> sb:</span><br><span class="line">        baning = banSb(gid, ban_list=sb, time=time)</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">async</span> <span class="keyword">for</span> baned <span class="keyword">in</span> baning:</span><br><span class="line">                <span class="keyword">if</span> baned:</span><br><span class="line">                    <span class="keyword">await</span> baned</span><br><span class="line">        <span class="keyword">except</span> ActionFailed:</span><br><span class="line">            <span class="keyword">await</span> ban.finish(<span class="string">&quot;权限不足&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">pass</span></span><br><span class="line">            <span class="comment"># if time is not None:</span></span><br><span class="line">            <span class="comment">#     await ban.finish(&quot;禁言操作成功&quot;)</span></span><br><span class="line">            <span class="comment"># else:</span></span><br><span class="line">            <span class="comment">#     await ban.finish(&quot;该用户已被禁言随机时长&quot;)</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">unban = on_command(<span class="string">&quot;解&quot;</span>, priority=<span class="number">1</span>, block=<span class="literal">True</span>, permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER)</span><br><span class="line"><span class="meta">@unban.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">bot: Bot, event: GroupMessageEvent</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    /解 @user 解禁</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    sb = At(event.json())</span><br><span class="line">    gid = event.group_id</span><br><span class="line">    <span class="keyword">if</span> sb:</span><br><span class="line">        baning = banSb(gid, ban_list=sb, time=<span class="number">0</span>)</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">async</span> <span class="keyword">for</span> baned <span class="keyword">in</span> baning:</span><br><span class="line">                <span class="keyword">if</span> baned:</span><br><span class="line">                    <span class="keyword">await</span> baned</span><br><span class="line">        <span class="keyword">except</span> ActionFailed:</span><br><span class="line">            <span class="keyword">await</span> unban.finish(<span class="string">&quot;权限不足&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">await</span> unban.finish(<span class="string">&quot;解禁操作成功&quot;</span>)</span><br><span class="line"></span><br><span class="line">msg_recall = on_command(<span class="string">&quot;撤回&quot;</span>, priority=<span class="number">1</span>, aliases=&#123;<span class="string">&quot;删除&quot;</span>, <span class="string">&quot;recall&quot;</span>&#125;, block=<span class="literal">True</span>,</span><br><span class="line">                        permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER)</span><br><span class="line"><span class="meta">@msg_recall.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">bot: Bot, event: GroupMessageEvent</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    指令格式:</span></span><br><span class="line"><span class="string">    /撤回 @user n</span></span><br><span class="line"><span class="string">    回复指定消息时撤回该条消息；使用艾特时撤回被艾特的人在本群 n*19 历史消息内的所有消息。</span></span><br><span class="line"><span class="string">    不输入 n 则默认 n=5</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># msg = str(event.get_message())</span></span><br><span class="line">    msg = MsgText(event.json())</span><br><span class="line">    sb = At(event.json())</span><br><span class="line">    rp = Reply(event.json())</span><br><span class="line">    gid = event.group_id</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> gid:  <span class="comment"># <span class="doctag">FIXME:</span> 有必要加吗？</span></span><br><span class="line">        <span class="keyword">await</span> msg_recall.finish(<span class="string">&quot;请在群内使用！&quot;</span>)</span><br><span class="line">    recall_msg_id = []</span><br><span class="line">    <span class="keyword">if</span> rp:</span><br><span class="line">        recall_msg_id.append(rp[<span class="string">&quot;message_id&quot;</span>])</span><br><span class="line">    <span class="keyword">elif</span> sb:</span><br><span class="line">        seq = <span class="literal">None</span></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(msg.split(<span class="string">&quot; &quot;</span>)) &gt; <span class="number">1</span>:</span><br><span class="line">            <span class="keyword">try</span>:  <span class="comment"># counts = n</span></span><br><span class="line">                counts = <span class="built_in">int</span>(msg.split(<span class="string">&quot; &quot;</span>)[-<span class="number">1</span>])</span><br><span class="line">            <span class="keyword">except</span> ValueError:</span><br><span class="line">                counts = <span class="number">5</span>  <span class="comment"># 出现错误就默认为 5 【理论上除非是 /撤回 @user n 且 n 不是数值时才有可能触发】</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            counts = <span class="number">5</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(counts):  <span class="comment"># 获取 n 次</span></span><br><span class="line">                <span class="keyword">await</span> asleep(randint(<span class="number">0</span>, <span class="number">10</span>))  <span class="comment"># 睡眠随机时间，避免黑号</span></span><br><span class="line">                res = <span class="keyword">await</span> bot.call_api(<span class="string">&quot;get_group_msg_history&quot;</span>, group_id=gid, message_seq=seq)  <span class="comment"># 获取历史消息</span></span><br><span class="line">                flag = <span class="literal">True</span></span><br><span class="line">                <span class="keyword">for</span> message <span class="keyword">in</span> res[<span class="string">&quot;messages&quot;</span>]:  <span class="comment"># 历史消息列表</span></span><br><span class="line">                    <span class="keyword">if</span> flag:</span><br><span class="line">                        seq = <span class="built_in">int</span>(message[<span class="string">&quot;message_seq&quot;</span>]) - <span class="number">1</span></span><br><span class="line">                        flag = <span class="literal">False</span></span><br><span class="line">                    <span class="keyword">if</span> <span class="built_in">int</span>(message[<span class="string">&quot;user_id&quot;</span>]) <span class="keyword">in</span> sb:  <span class="comment"># 将消息id加入列表</span></span><br><span class="line">                        recall_msg_id.append(<span class="built_in">int</span>(message[<span class="string">&quot;message_id&quot;</span>]))</span><br><span class="line">        <span class="keyword">except</span> ActionFailed <span class="keyword">as</span> e:</span><br><span class="line">            <span class="keyword">await</span> msg_recall.send(<span class="string">f&quot;获取群历史消息时发生错误&quot;</span>)</span><br><span class="line">            print_exc()</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">await</span> msg_recall.finish(<span class="string">&quot;指令格式：\n/撤回 @user 撤回数量\n回复指定消息时撤回该条消息；使用@时撤回被@的人在本群 撤回数量*19 历史消息内的所有消息。\n不输入撤回数量则默认5&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 实际进行撤回的部分</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">for</span> msg_id <span class="keyword">in</span> recall_msg_id:</span><br><span class="line">            <span class="keyword">await</span> asleep(randint(<span class="number">0</span>, <span class="number">3</span>))  <span class="comment"># 睡眠随机时间，避免黑号</span></span><br><span class="line">            <span class="keyword">await</span> bot.call_api(<span class="string">&quot;delete_msg&quot;</span>, message_id=msg_id)</span><br><span class="line">    <span class="keyword">except</span> ActionFailed <span class="keyword">as</span> e:</span><br><span class="line">        <span class="keyword">await</span> msg_recall.finish(<span class="string">&quot;执行失败，可能是我权限不足&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">await</span> msg_recall.finish(<span class="string">f&quot;操作成功，一共撤回了 <span class="subst">&#123;<span class="built_in">len</span>(recall_msg_id)&#125;</span> 条消息&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">str_left</span>(<span class="params">t, s</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">isinstance</span>(t, <span class="built_in">str</span>) != <span class="literal">True</span> <span class="keyword">or</span> <span class="built_in">isinstance</span>(s, <span class="built_in">str</span>) != <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;传入参数有误&#x27;</span></span><br><span class="line">    <span class="keyword">elif</span> t.find(s) != -<span class="number">1</span>:</span><br><span class="line">        <span class="keyword">return</span> t[<span class="number">0</span>:t.find(s)]</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">str_right</span>(<span class="params">t, s</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">isinstance</span>(t, <span class="built_in">str</span>) != <span class="literal">True</span> <span class="keyword">or</span> <span class="built_in">isinstance</span>(s, <span class="built_in">str</span>) != <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;传入参数有误&#x27;</span></span><br><span class="line">    <span class="keyword">elif</span> t.rfind(s) != -<span class="number">1</span>:</span><br><span class="line">        <span class="keyword">return</span> t[t.rfind(s) + <span class="built_in">len</span>(s):<span class="built_in">len</span>(t)]</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">set_timestring</span>(<span class="params">set_time</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    把秒转换成某天某时某分某秒</span></span><br><span class="line"><span class="string">    :param set_time:</span></span><br><span class="line"><span class="string">    :return:</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    time_string = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    day = set_time / <span class="number">86400</span></span><br><span class="line">    hours = set_time % <span class="number">86400</span> / <span class="number">3600</span></span><br><span class="line">    minutes = set_time % <span class="number">86400</span> % <span class="number">3600</span> / <span class="number">60</span></span><br><span class="line">    seconds = set_time % <span class="number">86400</span> % <span class="number">3600</span> % <span class="number">60</span></span><br><span class="line">    <span class="keyword">if</span> day &gt;= <span class="number">1</span>:</span><br><span class="line">        time_string += <span class="built_in">str</span>(<span class="built_in">int</span>(day)) + <span class="string">&#x27;天&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> hours &gt;= <span class="number">1</span>:</span><br><span class="line">        time_string += <span class="built_in">str</span>(<span class="built_in">int</span>(hours)) + <span class="string">&#x27;时&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> minutes &gt;= <span class="number">1</span>:</span><br><span class="line">        time_string += <span class="built_in">str</span>(<span class="built_in">int</span>(minutes)) + <span class="string">&#x27;分&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> seconds &gt;= <span class="number">1</span>:</span><br><span class="line">        time_string += <span class="built_in">str</span>(<span class="built_in">int</span>(seconds)) + <span class="string">&#x27;秒&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> time_string</span><br></pre></td></tr></table></figure><h1 id="网易云音乐插件"><a href="#网易云音乐插件" class="headerlink" title="网易云音乐插件"></a>网易云音乐插件</h1><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>支持点歌</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>支持下载</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>支持随机推荐</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>支持根据作者歌单随机推荐</p>            </div><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/7/11 01:42</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : wyy.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line"><span class="keyword">import</span> execjs</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> codecs</span><br><span class="line"><span class="keyword">from</span> Crypto.Cipher <span class="keyword">import</span> AES</span><br><span class="line"><span class="keyword">from</span> Crypto.Util.Padding <span class="keyword">import</span> pad</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11 <span class="keyword">import</span> Message</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> Arg, CommandArg, ArgPlainText</span><br><span class="line"><span class="keyword">from</span> lxml <span class="keyword">import</span> etree</span><br><span class="line"><span class="keyword">from</span> nonebot.matcher <span class="keyword">import</span> Matcher</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line">__plugin_meta__ = nonebot.plugin.PluginMetadata(</span><br><span class="line">    name=<span class="string">&#x27;网易云音乐&#x27;</span>,</span><br><span class="line">    description=<span class="string">&#x27;网易云音乐搜索下载&#x27;</span>,</span><br><span class="line">    usage=<span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">    命令1/wyy/网易云音乐/点歌&lt;参数：歌曲名,序号&gt;不含下载</span></span><br><span class="line"><span class="string">    命令2/wyys/网易云音乐s/下载&lt;参数：歌曲名,序号&gt;含下载</span></span><br><span class="line"><span class="string">    命令3/pushy/歌曲推荐/推荐&lt;参数：无&gt;随机推荐</span></span><br><span class="line"><span class="string">    命令4/pushys/歌曲推荐s/推荐s&lt;参数：无&gt;根据作者的歌单推荐</span></span><br><span class="line"><span class="string">    &#x27;&#x27;&#x27;</span>,</span><br><span class="line">    extra=&#123;<span class="string">&#x27;version&#x27;</span>: <span class="string">&#x27;1.3&#x27;</span>&#125;</span><br><span class="line">)</span><br><span class="line">__help_version__ = <span class="string">&#x27;1.3&#x27;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">wyys = on_command(<span class="string">&quot;wyys&quot;</span>, aliases=&#123;<span class="string">&quot;网易云音乐s&quot;</span>, <span class="string">&quot;下载&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"><span class="comment"># 点歌 不下载只能试听</span></span><br><span class="line"><span class="meta">@wyys.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_first_receive</span>(<span class="params">matcher: Matcher, args: nonebot.adapters.Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    list_name = args.extract_plain_text().strip()</span><br><span class="line">    <span class="keyword">if</span> list_name:</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;music_name&quot;</span>, args)</span><br><span class="line"></span><br><span class="line"><span class="meta">@wyys.got(<span class="params"><span class="string">&quot;music_name&quot;</span>, prompt=<span class="string">&quot;你想下载的歌曲是？&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">matcher: Matcher, music_name: nonebot.adapters.Message = Arg(<span class="params"></span>), text: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;music_name&quot;</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> text:</span><br><span class="line">        <span class="keyword">await</span> wyys.reject(music_name.template(<span class="string">&quot;待下载的歌曲名不能为空&quot;</span>))</span><br><span class="line">    <span class="keyword">if</span> <span class="string">&quot;,&quot;</span> <span class="keyword">in</span> text:</span><br><span class="line">        stt = text.split(<span class="string">&quot;,&quot;</span>)</span><br><span class="line">        name = stt[<span class="number">0</span>]</span><br><span class="line">        ids = stt[<span class="number">1</span>]</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;id&quot;</span>, Message(ids))</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;music_name&quot;</span>, Message(name))</span><br><span class="line">    <span class="keyword">elif</span> <span class="string">&quot;，&quot;</span> <span class="keyword">in</span> text:</span><br><span class="line">        stt = text.split(<span class="string">&quot;，&quot;</span>)</span><br><span class="line">        name = stt[<span class="number">0</span>]</span><br><span class="line">        ids = stt[<span class="number">1</span>]</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;id&quot;</span>, Message(ids))</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;music_name&quot;</span>, Message(name))</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        ids = <span class="string">&#x27;0&#x27;</span></span><br><span class="line">        name = text</span><br><span class="line"></span><br><span class="line">    wyy2 = WangYiYun()</span><br><span class="line">    ret = wyy2.get_wyy_kwd(name)</span><br><span class="line">    n = <span class="number">0</span></span><br><span class="line">    music_names = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> ids != <span class="string">&#x27;0&#x27;</span>:</span><br><span class="line">        music_id = ret[<span class="string">&#x27;result&#x27;</span>][<span class="string">&#x27;songs&#x27;</span>][(<span class="built_in">int</span>(ids) - <span class="number">1</span>)][<span class="string">&#x27;id&#x27;</span>]</span><br><span class="line">        <span class="keyword">if</span> music_id:</span><br><span class="line">            url = wyy2.get_wyy_playurl(music_id)</span><br><span class="line">            <span class="keyword">await</span> wyys.finish(<span class="string">&quot;[&#123;0&#125;]下载地址：&quot;</span>.<span class="built_in">format</span>(ret[<span class="string">&#x27;result&#x27;</span>][<span class="string">&#x27;songs&#x27;</span>][(<span class="built_in">int</span>(ids) - <span class="number">1</span>)][<span class="string">&#x27;name&#x27;</span>]) + url)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">await</span> wyys.finish(<span class="string">&quot;音乐ID获取失败&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> ret[<span class="string">&#x27;result&#x27;</span>][<span class="string">&#x27;songs&#x27;</span>]:</span><br><span class="line">            n += <span class="number">1</span></span><br><span class="line">            music_names += <span class="string">&#x27;[&#123;0&#125;]&#x27;</span>.<span class="built_in">format</span>(n) + i[<span class="string">&#x27;name&#x27;</span>] + <span class="string">&#x27; - &#x27;</span> + i[<span class="string">&#x27;ar&#x27;</span>][(<span class="built_in">int</span>(ids) - <span class="number">1</span>)][<span class="string">&#x27;name&#x27;</span>] + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">            <span class="keyword">if</span> n &gt;= <span class="number">10</span>:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">        <span class="keyword">await</span> wyys.send(music_names)</span><br><span class="line"></span><br><span class="line"><span class="meta">@wyys.got(<span class="params"><span class="string">&quot;id&quot;</span>, prompt=<span class="string">&quot;请选择要下载第几个？&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">music_name: nonebot.adapters.Message = Arg(<span class="params"></span>), text: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;music_name&quot;</span></span>), ids: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;id&quot;</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> ids:</span><br><span class="line">        <span class="keyword">await</span> wyys.reject(music_name.template(<span class="string">&quot;你还没有选择第几个哦&quot;</span>))</span><br><span class="line">    wyy2 = WangYiYun()</span><br><span class="line">    ret = wyy2.get_wyy_kwd(text)</span><br><span class="line">    music_id = ret[<span class="string">&#x27;result&#x27;</span>][<span class="string">&#x27;songs&#x27;</span>][(<span class="built_in">int</span>(ids) - <span class="number">1</span>)][<span class="string">&#x27;id&#x27;</span>]</span><br><span class="line">    <span class="keyword">if</span> music_id:</span><br><span class="line">        url = wyy2.get_wyy_playurl(music_id)</span><br><span class="line">        <span class="keyword">await</span> wyys.finish(<span class="string">&quot;[&#123;0&#125;]下载地址：&quot;</span>.<span class="built_in">format</span>(ret[<span class="string">&#x27;result&#x27;</span>][<span class="string">&#x27;songs&#x27;</span>][(<span class="built_in">int</span>(ids) - <span class="number">1</span>)][<span class="string">&#x27;name&#x27;</span>]) + url)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">await</span> wyys.finish(<span class="string">&quot;音乐ID获取失败&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">wyy = on_command(<span class="string">&quot;wyy&quot;</span>, aliases=&#123;<span class="string">&quot;网易云音乐&quot;</span>, <span class="string">&quot;点歌&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"><span class="comment"># 点歌 不下载只能试听</span></span><br><span class="line"><span class="meta">@wyy.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_first_receive</span>(<span class="params">matcher: Matcher, args: nonebot.adapters.Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    list_name = args.extract_plain_text().strip()</span><br><span class="line">    <span class="keyword">if</span> list_name:</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;music_name&quot;</span>, args)</span><br><span class="line"></span><br><span class="line"><span class="meta">@wyy.got(<span class="params"><span class="string">&quot;music_name&quot;</span>, prompt=<span class="string">&quot;你想搜索的歌曲是？&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">matcher: Matcher, music_name: nonebot.adapters.Message = Arg(<span class="params"></span>), text: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;music_name&quot;</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> text:</span><br><span class="line">        <span class="keyword">await</span> wyy.reject(music_name.template(<span class="string">&quot;待搜索的歌曲名不能为空&quot;</span>))</span><br><span class="line">    <span class="keyword">if</span> <span class="string">&quot;,&quot;</span> <span class="keyword">in</span> text:</span><br><span class="line">        stt = text.split(<span class="string">&quot;,&quot;</span>)</span><br><span class="line">        name = stt[<span class="number">0</span>]</span><br><span class="line">        ids = stt[<span class="number">1</span>]</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;id&quot;</span>, Message(ids))</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;music_name&quot;</span>, Message(name))</span><br><span class="line">    <span class="keyword">elif</span> <span class="string">&quot;，&quot;</span> <span class="keyword">in</span> text:</span><br><span class="line">        stt = text.split(<span class="string">&quot;，&quot;</span>)</span><br><span class="line">        name = stt[<span class="number">0</span>]</span><br><span class="line">        ids = stt[<span class="number">1</span>]</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;id&quot;</span>, Message(ids))</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;music_name&quot;</span>, Message(name))</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        ids = <span class="string">&#x27;0&#x27;</span></span><br><span class="line">        name = text</span><br><span class="line"></span><br><span class="line">    wyy2 = WangYiYun()</span><br><span class="line">    ret = wyy2.get_wyy_kwd(name)</span><br><span class="line">    n = <span class="number">0</span></span><br><span class="line">    music_names = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> ids != <span class="string">&#x27;0&#x27;</span>:</span><br><span class="line">        music_id = ret[<span class="string">&#x27;result&#x27;</span>][<span class="string">&#x27;songs&#x27;</span>][(<span class="built_in">int</span>(ids) - <span class="number">1</span>)][<span class="string">&#x27;id&#x27;</span>]</span><br><span class="line">        msg = <span class="string">&quot;[CQ:music,type=163,id=&#123;0&#125;]&quot;</span>.<span class="built_in">format</span>(<span class="built_in">str</span>(music_id))</span><br><span class="line">        <span class="keyword">await</span> wyy.finish(Message(msg))</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> ret[<span class="string">&#x27;result&#x27;</span>][<span class="string">&#x27;songs&#x27;</span>]:</span><br><span class="line">            n += <span class="number">1</span></span><br><span class="line">            music_names += <span class="string">&#x27;[&#123;0&#125;]&#x27;</span>.<span class="built_in">format</span>(n) + i[<span class="string">&#x27;name&#x27;</span>] + <span class="string">&#x27; - &#x27;</span> + i[<span class="string">&#x27;ar&#x27;</span>][(<span class="built_in">int</span>(ids) - <span class="number">1</span>)][<span class="string">&#x27;name&#x27;</span>] + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">            <span class="keyword">if</span> n &gt;= <span class="number">10</span>:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">        <span class="keyword">await</span> wyy.send(music_names)</span><br><span class="line"></span><br><span class="line"><span class="meta">@wyy.got(<span class="params"><span class="string">&quot;id&quot;</span>, prompt=<span class="string">&quot;请选择要播放第几个？&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">music_name: nonebot.adapters.Message = Arg(<span class="params"></span>), text: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;music_name&quot;</span></span>), ids: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;id&quot;</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> ids:</span><br><span class="line">        <span class="keyword">await</span> wyy.reject(music_name.template(<span class="string">&quot;你还没有选择第几个哦&quot;</span>))</span><br><span class="line">    <span class="comment"># 这个肯定是没有获取到ids才执行的 所有需要把代码放在if里面 如果是用的finish也可以不放 用send肯定要放</span></span><br><span class="line">    wyy2 = WangYiYun()</span><br><span class="line">    ret = wyy2.get_wyy_kwd(text)</span><br><span class="line">    music_id = ret[<span class="string">&#x27;result&#x27;</span>][<span class="string">&#x27;songs&#x27;</span>][(<span class="built_in">int</span>(ids) - <span class="number">1</span>)][<span class="string">&#x27;id&#x27;</span>]</span><br><span class="line">    msg = <span class="string">&quot;[CQ:music,type=163,id=&#123;0&#125;]&quot;</span>.<span class="built_in">format</span>(<span class="built_in">str</span>(music_id))</span><br><span class="line">    <span class="keyword">await</span> wyy.finish(Message(msg))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">song = on_command(<span class="string">&quot;pushy&quot;</span>, aliases=&#123;<span class="string">&quot;推荐&quot;</span>, <span class="string">&quot;歌曲推荐&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"><span class="meta">@song.handle()</span></span><br><span class="line"><span class="comment"># 随机推荐</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>():</span><br><span class="line">    wyys = WangYiYun()</span><br><span class="line">    listplay_id = wyys.get_wyy_pushy()</span><br><span class="line">    msg = <span class="string">&quot;[CQ:music,type=163,id=&#123;0&#125;]&quot;</span>.<span class="built_in">format</span>(wyys.get_wyy_discover(listplay_id))</span><br><span class="line">    <span class="keyword">await</span> song.send(Message(msg))</span><br><span class="line"></span><br><span class="line">songs = on_command(<span class="string">&quot;pushys&quot;</span>, aliases=&#123;<span class="string">&quot;推荐s&quot;</span>, <span class="string">&quot;歌曲推荐s&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"><span class="meta">@songs.handle()</span></span><br><span class="line"><span class="comment"># 从作者的歌单中随机推荐</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>():</span><br><span class="line">    wyys = WangYiYun()</span><br><span class="line">    listplay_id = [<span class="string">&#x27;/playlist?id=7480897649&#x27;</span>]</span><br><span class="line">    msg = <span class="string">&quot;[CQ:music,type=163,id=&#123;0&#125;]&quot;</span>.<span class="built_in">format</span>(wyys.get_wyy_discover(listplay_id))</span><br><span class="line">    <span class="keyword">await</span> songs.send(Message(msg))</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">to_16</span>(<span class="params">key</span>):</span><br><span class="line">    <span class="keyword">while</span> <span class="built_in">len</span>(key) % <span class="number">16</span> != <span class="number">0</span>:</span><br><span class="line">        key += <span class="string">&#x27;\0&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">str</span>.encode(key)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">AES_encrypt</span>(<span class="params">text, key, iv</span>):</span><br><span class="line">    bs = AES.block_size</span><br><span class="line">    pad2 = <span class="keyword">lambda</span> s: s + (bs - <span class="built_in">len</span>(s) % bs) * <span class="built_in">chr</span>(bs - <span class="built_in">len</span>(s) % bs)</span><br><span class="line">    encryptor = AES.new(to_16(key), AES.MODE_CBC, to_16(iv))</span><br><span class="line"></span><br><span class="line">    pd2 = pad(<span class="built_in">str</span>.encode(pad2(text)), <span class="number">16</span>)</span><br><span class="line"></span><br><span class="line">    encrypt_aes = encryptor.encrypt(pd2)</span><br><span class="line">    encrypt_text = <span class="built_in">str</span>(base64.encodebytes(encrypt_aes), encoding=<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">    <span class="keyword">return</span> encrypt_text</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">RSA_encrypt</span>(<span class="params">text, pubKey, modulus</span>):</span><br><span class="line">    text = text[::-<span class="number">1</span>]</span><br><span class="line">    rs = <span class="built_in">int</span>(codecs.encode(text.encode(<span class="string">&#x27;utf-8&#x27;</span>), <span class="string">&#x27;hex_codec&#x27;</span>), <span class="number">16</span>) ** <span class="built_in">int</span>(pubKey, <span class="number">16</span>) % <span class="built_in">int</span>(modulus, <span class="number">16</span>)</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">format</span>(rs, <span class="string">&#x27;x&#x27;</span>).zfill(<span class="number">256</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取i值的函数，即随机生成长度为16的字符串</span></span><br><span class="line">get_i = execjs.<span class="built_in">compile</span>(<span class="string">r&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    function a(a) &#123;</span></span><br><span class="line"><span class="string">        var d, e, b = &quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&quot;, c = &quot;&quot;;</span></span><br><span class="line"><span class="string">        for (d = 0; a &gt; d; d += 1)</span></span><br><span class="line"><span class="string">            e = Math.random() * b.length,</span></span><br><span class="line"><span class="string">            e = Math.floor(e),</span></span><br><span class="line"><span class="string">            c += b.charAt(e);</span></span><br><span class="line"><span class="string">        return c</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">WangYiYun</span>():</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line">        self.csrf_token = <span class="string">&#x27;&#x27;</span> <span class="comment"># 抓包填写自己的</span></span><br><span class="line">        self.MUSIC_U = <span class="string">&#x27;&#x27;</span> <span class="comment"># 抓包填写自己的</span></span><br><span class="line">        self.g = <span class="string">&#x27;0CoJUm6Qyw8W8jud&#x27;</span></span><br><span class="line">        self.b = <span class="string">&quot;010001&quot;</span></span><br><span class="line">        self.c = <span class="string">&#x27;00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7&#x27;</span></span><br><span class="line">        self.i = get_i.call(<span class="string">&#x27;a&#x27;</span>, <span class="number">16</span>)</span><br><span class="line">        self.iv = <span class="string">&quot;0102030405060708&quot;</span></span><br><span class="line">        <span class="comment"># if not os.path.exists(&quot;d:/music&quot;):</span></span><br><span class="line">        <span class="comment">#     os.mkdir(&#x27;d:/music&#x27;)</span></span><br><span class="line">        self.ua = <span class="string">&#x27;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36&#x27;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_encSecKey</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> RSA_encrypt(self.i, self.b, self.c)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_wyy_pushy</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="comment"># 取随机列表</span></span><br><span class="line">        url = <span class="string">&#x27;https://music.163.com/discover&#x27;</span></span><br><span class="line">        ret = requests.get(url, headers=&#123;<span class="string">&quot;User-Agent&quot;</span>: self.ua&#125;).text</span><br><span class="line">        soup = etree.HTML(ret)</span><br><span class="line">        hot_id = soup.xpath(<span class="string">&#x27;//ul[@class=&quot;m-cvrlst f-cb&quot;]//li/div[@class=&quot;u-cover u-cover-1&quot;]/a/@href&#x27;</span>)</span><br><span class="line">        n = <span class="built_in">len</span>(hot_id)</span><br><span class="line">        bek = []</span><br><span class="line">        <span class="comment"># 去除电台dj</span></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line">            <span class="keyword">if</span> <span class="string">&quot;/dj&quot;</span> <span class="keyword">in</span> hot_id[i]:</span><br><span class="line">                bek.append(i)</span><br><span class="line">        hot_id = [hot_id[i] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n) <span class="keyword">if</span> (i <span class="keyword">not</span> <span class="keyword">in</span> bek)]</span><br><span class="line">        <span class="keyword">return</span> hot_id</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_wyy_discover</span>(<span class="params">self, list_id</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        从列表中随机取一首</span></span><br><span class="line"><span class="string">        :param list_id: 列表id</span></span><br><span class="line"><span class="string">        :return:</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        playlist_id = list_id[random.randint(<span class="number">0</span>, <span class="built_in">len</span>(list_id) - <span class="number">1</span>)]</span><br><span class="line">        <span class="comment"># 这里要添加自己的cookie 否则只能随机前10条</span></span><br><span class="line">        cookie = <span class="string">&#x27;&#x27;</span></span><br><span class="line">        ret = requests.get(<span class="string">&quot;https://music.163.com&quot;</span> + playlist_id, headers=&#123;<span class="string">&quot;User-Agent&quot;</span>: self.ua, <span class="string">&quot;Cookie&quot;</span>: cookie&#125;).text</span><br><span class="line">        soup = etree.HTML(ret)</span><br><span class="line">        m_id = soup.xpath(<span class="string">&#x27;//ul[@class=&quot;f-hide&quot;]/li/a/@href&#x27;</span>)</span><br><span class="line">        song_id = m_id[random.randint(<span class="number">0</span>, <span class="built_in">len</span>(m_id) - <span class="number">1</span>)][<span class="number">9</span>:]</span><br><span class="line">        <span class="keyword">return</span> song_id</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_wyy_kwd</span>(<span class="params">self, keyword</span>):</span><br><span class="line"></span><br><span class="line">        url = <span class="string">&#x27;https://music.163.com/weapi/cloudsearch/get/web?csrf_token=&#x27;</span> + self.csrf_token</span><br><span class="line">        encText = <span class="built_in">str</span>(</span><br><span class="line">            &#123;<span class="string">&#x27;hlpretag&#x27;</span>: <span class="string">&#x27;&lt;span class=\&quot;s-fc7\&quot;&gt;&#x27;</span>, <span class="string">&#x27;hlposttag&#x27;</span>: <span class="string">&#x27;&lt;/span&gt;&#x27;</span>, <span class="string">&#x27;#/discover&#x27;</span>: <span class="string">&#x27;&#x27;</span>, <span class="string">&#x27;s&#x27;</span>: keyword, <span class="string">&#x27;type&#x27;</span>: <span class="string">&#x27;1&#x27;</span>,</span><br><span class="line">             <span class="string">&#x27;offset&#x27;</span>: <span class="string">&quot;0&quot;</span>, <span class="string">&#x27;total&#x27;</span>: <span class="string">&#x27;true&#x27;</span>, <span class="string">&#x27;limit&#x27;</span>: <span class="string">&#x27;30&#x27;</span>, <span class="string">&#x27;csrf_token&#x27;</span>: self.csrf_token&#125;)</span><br><span class="line">        params = AES_encrypt(AES_encrypt(encText, self.g, self.iv), self.i, self.iv)</span><br><span class="line">        data = &#123;</span><br><span class="line">            <span class="string">&#x27;params&#x27;</span>: params,</span><br><span class="line">            <span class="string">&#x27;encSecKey&#x27;</span>: self.get_encSecKey()</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        header = &#123;</span><br><span class="line">            <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/x-www-form-urlencoded&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;Host&#x27;</span>: <span class="string">&#x27;music.163.com&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;Referer&#x27;</span>: <span class="string">&#x27;https://music.163.com/search/&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;User-Agent&#x27;</span>: self.ua</span><br><span class="line">        &#125;</span><br><span class="line">        ret = requests.post(url, headers=header, data=data)</span><br><span class="line">        <span class="comment"># print(&#x27;搜索结果&#x27;, ret.text)</span></span><br><span class="line">        <span class="keyword">return</span> ret.json()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_wyy_playurl</span>(<span class="params">self, music_id</span>):</span><br><span class="line"></span><br><span class="line">        url = <span class="string">&#x27;https://music.163.com/weapi/song/enhance/player/url?csrf_token=&#x27;</span> + self.csrf_token</span><br><span class="line">        encText = <span class="built_in">str</span>(&#123;<span class="string">&#x27;ids&#x27;</span>: <span class="string">&quot;[&quot;</span> + <span class="built_in">str</span>(music_id) + <span class="string">&quot;]&quot;</span>, <span class="string">&#x27;br&#x27;</span>: <span class="number">128000</span>, <span class="string">&#x27;csrf_token&#x27;</span>: self.csrf_token,</span><br><span class="line">                       <span class="string">&#x27;MUSIC_U&#x27;</span>: self.MUSIC_U&#125;)</span><br><span class="line">        params = AES_encrypt(AES_encrypt(encText, self.g, self.iv), self.i, self.iv)</span><br><span class="line">        data = &#123;</span><br><span class="line">            <span class="string">&#x27;params&#x27;</span>: params,</span><br><span class="line">            <span class="string">&#x27;encSecKey&#x27;</span>: self.get_encSecKey()</span><br><span class="line">        &#125;</span><br><span class="line">        headeer = &#123;</span><br><span class="line">            <span class="string">&#x27;User-Agent&#x27;</span>: self.ua,</span><br><span class="line">            <span class="string">&#x27;Referer&#x27;</span>: <span class="string">&#x27;https://music.163.com/&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/x-www-form-urlencoded&#x27;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        ret = requests.post(url, headers=headeer, data=data).json()</span><br><span class="line">        download_url = ret[<span class="string">&#x27;data&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;url&#x27;</span>]</span><br><span class="line">        <span class="keyword">if</span> download_url:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                msg = download_url</span><br><span class="line">                <span class="comment"># 根据音乐url地址，用urllib.request.retrieve直接将远程数据下载到本地</span></span><br><span class="line">                <span class="comment"># urllib.request.urlretrieve(download_url, &#x27;d:/music/&#x27; + music_name+ &#x27;.mp3&#x27;)</span></span><br><span class="line">                <span class="comment"># print(&#x27;Successfully Download:&#x27;+music_name+ &#x27;.mp3&#x27;)</span></span><br><span class="line">            <span class="keyword">except</span>:</span><br><span class="line">                msg = <span class="string">&#x27;出错了~&#x27;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            msg = <span class="string">&#x27;获取失败&#x27;</span></span><br><span class="line">        <span class="keyword">return</span> msg</span><br></pre></td></tr></table></figure><h1 id="微博热搜插件"><a href="#微博热搜插件" class="headerlink" title="微博热搜插件"></a>微博热搜插件</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> lxml <span class="keyword">import</span> etree</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters <span class="keyword">import</span> Message</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> CommandArg</span><br><span class="line">__plugin_meta__ = nonebot.plugin.PluginMetadata(</span><br><span class="line">    name=<span class="string">&#x27;微博热搜&#x27;</span>,</span><br><span class="line">    description=<span class="string">&#x27;获取微博热搜&#x27;</span>,</span><br><span class="line">    usage=<span class="string">&#x27;&#x27;&#x27;命令/wbhot&lt;参数：数量 默认10&gt;&#x27;&#x27;&#x27;</span>,</span><br><span class="line">    extra=&#123;<span class="string">&#x27;version&#x27;</span>: <span class="string">&#x27;1.0&#x27;</span>&#125;</span><br><span class="line">)</span><br><span class="line">__help_version__ = <span class="string">&#x27;1.0&#x27;</span></span><br><span class="line"></span><br><span class="line">weibohot = on_command(<span class="string">&quot;wbhot&quot;</span>, aliases=&#123;<span class="string">&quot;微博&quot;</span>, <span class="string">&quot;热搜&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"><span class="meta">@weibohot.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_first_receive</span>(<span class="params">args: Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    num = args.extract_plain_text()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> num:</span><br><span class="line">        num = <span class="string">&#x27;10&#x27;</span></span><br><span class="line">    url = <span class="string">&#x27;https://passport.weibo.com/visitor/visitor?a=incarnate&amp;t=LomBgTEURrl3AoXFT346PaH7q%2FNDphe9Xzpc1S3RCJ4%3D&amp;w=2&amp;c=095&amp;gc=&amp;cb=cross_domain&amp;from=weibo&amp;_rand=0.00811768666053514&#x27;</span></span><br><span class="line">    headers = &#123;</span><br><span class="line">        <span class="string">&#x27;user-agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36&#x27;</span>,</span><br><span class="line">    &#125;</span><br><span class="line">    response = requests.get(url=url, headers=headers)</span><br><span class="line">    cookie = requests.utils.dict_from_cookiejar(response.cookies)</span><br><span class="line">    url = <span class="string">&#x27;https://s.weibo.com/top/summary?cate=realtimehot&#x27;</span></span><br><span class="line">    response = requests.get(url=url, headers=headers, cookies=cookie).text</span><br><span class="line">    soup = etree.HTML(response)</span><br><span class="line">    hot_name = soup.xpath(<span class="string">&#x27;//div[@class=&quot;data&quot;]//tr/td[@class=&quot;td-02&quot;]/a/text()&#x27;</span>)</span><br><span class="line">    hot_int = soup.xpath(<span class="string">&#x27;//div[@class=&quot;data&quot;]//tr/td[@class=&quot;td-02&quot;]/span/text()&#x27;</span>)</span><br><span class="line">    hot_url = soup.xpath(<span class="string">&#x27;//div[@class=&quot;data&quot;]//tr/td[@class=&quot;td-02&quot;]/a/@href&#x27;</span>)</span><br><span class="line">    n = <span class="number">0</span></span><br><span class="line">    txt = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    hot = <span class="string">&#x27;，热度：&#x27;</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> hot_name:</span><br><span class="line">        hot_ints = hot_int[n - <span class="number">1</span>] <span class="keyword">if</span> n &gt; <span class="number">0</span> <span class="keyword">else</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">int</span>(num) &gt; <span class="number">15</span>:</span><br><span class="line">            txt = <span class="string">&quot;&#123;0&#125;&quot;</span> + i + <span class="string">&quot;&#123;1&#125;&quot;</span> + hot_ints + <span class="string">&#x27;\n 详情：https://s.weibo.com&#x27;</span> + hot_url[n]</span><br><span class="line">            txt = txt.<span class="built_in">format</span>(<span class="string">&#x27;【置顶】&#x27;</span> <span class="keyword">if</span> hot_ints == <span class="string">&#x27;&#x27;</span> <span class="keyword">else</span> <span class="built_in">str</span>(n) + <span class="string">&#x27;.&#x27;</span>, <span class="string">&#x27;&#x27;</span> <span class="keyword">if</span> hot_ints == <span class="string">&#x27;&#x27;</span> <span class="keyword">else</span> hot)</span><br><span class="line">            <span class="keyword">await</span> weibohot.send(txt)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            txt += <span class="string">&quot;&#123;0&#125;&quot;</span> + i + <span class="string">&quot;&#123;1&#125;&quot;</span> + hot_ints + <span class="string">&#x27;\n 详情：https://s.weibo.com&#x27;</span> + hot_url[n] + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">            txt = txt.<span class="built_in">format</span>(<span class="string">&#x27;【置顶】&#x27;</span> <span class="keyword">if</span> hot_ints == <span class="string">&#x27;&#x27;</span> <span class="keyword">else</span> <span class="built_in">str</span>(n) + <span class="string">&#x27;.&#x27;</span>, <span class="string">&#x27;&#x27;</span> <span class="keyword">if</span> hot_ints == <span class="string">&#x27;&#x27;</span> <span class="keyword">else</span> hot)</span><br><span class="line">        n += <span class="number">1</span></span><br><span class="line">        <span class="keyword">if</span> n &gt;= (<span class="built_in">int</span>(num) + <span class="number">1</span>):</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">int</span>(num) &lt;= <span class="number">15</span>:</span><br><span class="line">                <span class="keyword">await</span> weibohot.send(txt)</span><br><span class="line">            <span class="keyword">break</span></span><br></pre></td></tr></table></figure><h1 id="抖音相关插件"><a href="#抖音相关插件" class="headerlink" title="抖音相关插件"></a>抖音相关插件</h1><ul><li>v1.5修复获取失败的问题</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/7/13 6:01</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : douyin_video.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> hashlib</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> urllib.parse</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11 <span class="keyword">import</span> GroupMessageEvent</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> CommandArg</span><br><span class="line"><span class="keyword">from</span> nonebot.typing <span class="keyword">import</span> T_State</span><br><span class="line"><span class="keyword">from</span> .config <span class="keyword">import</span> plugin_config</span><br><span class="line"><span class="keyword">from</span> .switch <span class="keyword">import</span> load, upload</span><br><span class="line"></span><br><span class="line">_path = plugin_config.douyin_path</span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;抖音相关插件&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.5&#x27;</span></span><br><span class="line"></span><br><span class="line">__usage__ = <span class="string">&#x27;命令1/douyin/抖音/抖音解析&lt;参数：视频ID列表&gt;\n命令2/dyadd/抖音添加/dyset&lt;参数：29位作者短链&gt;\n命令3/dyget/记录美好生活/我要学习/我爱学习&lt;参数：无&gt;从添加的作者里面随机，绝不与上一次的内容重复&#x27;</span></span><br><span class="line">header = &#123;</span><br><span class="line">    <span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36&#x27;</span>&#125;</span><br><span class="line"></span><br><span class="line">douyin = on_command(<span class="string">&quot;douyin&quot;</span>, aliases=&#123;<span class="string">&quot;抖音&quot;</span>, <span class="string">&quot;抖音解析&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@douyin.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">args: nonebot.adapters.Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    video_list = args.extract_plain_text()</span><br><span class="line">    <span class="comment"># try:</span></span><br><span class="line">    <span class="comment">#     if len(url) &lt;= 29:</span></span><br><span class="line">    <span class="comment">#         ret = requests.get(url, allow_redirects=False, headers=header)</span></span><br><span class="line">    <span class="comment">#         location = ret.headers[&#x27;Location&#x27;]</span></span><br><span class="line">    <span class="comment">#         vid = re.search(r&#x27;7\d&#123;18&#125;&#x27;, location).group()</span></span><br><span class="line">    <span class="comment">#     else:</span></span><br><span class="line">    <span class="comment">#         vid = re.search(r&#x27;7\d&#123;18&#125;&#x27;, url).group()</span></span><br><span class="line">    <span class="comment"># except Exception:</span></span><br><span class="line">    <span class="comment">#     vid = &#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> video_list.find(<span class="string">&#x27;[&#x27;</span>) == -<span class="number">1</span>:</span><br><span class="line">        <span class="keyword">await</span> douyin.finish(<span class="string">&quot;格式有误，请以整数型数组方式输入视频id&quot;</span>)</span><br><span class="line">    ret = get_video_info(video_list)</span><br><span class="line">    i = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> data_list <span class="keyword">in</span> ret[<span class="string">&#x27;aweme_details&#x27;</span>]:</span><br><span class="line">        i += <span class="number">1</span></span><br><span class="line">        <span class="keyword">if</span> data_list[<span class="string">&#x27;aweme_type&#x27;</span>] == <span class="number">2</span>:</span><br><span class="line">            aweme_type = <span class="string">&#x27;图集&#x27;</span></span><br><span class="line">            dow_url = <span class="string">&#x27;&#x27;</span></span><br><span class="line">            duration = <span class="string">&#x27;&#x27;</span></span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> data_list[<span class="string">&#x27;images&#x27;</span>]:</span><br><span class="line">                dow_url += i[<span class="string">&#x27;url_list&#x27;</span>][<span class="number">0</span>] + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            aweme_type = <span class="string">&#x27;视频&#x27;</span></span><br><span class="line">            vid = data_list[<span class="string">&#x27;video&#x27;</span>][<span class="string">&#x27;play_addr_h264&#x27;</span>][<span class="string">&#x27;uri&#x27;</span>]</span><br><span class="line">            duration = <span class="string">&#x27;\n视频时长：&#x27;</span> + <span class="built_in">str</span>(<span class="built_in">round</span>(data_list[<span class="string">&#x27;duration&#x27;</span>] / <span class="number">1000</span>, <span class="number">1</span>)) + <span class="string">&#x27;秒&#x27;</span></span><br><span class="line">            url = <span class="string">&#x27;https://api-play-hl.amemv.com/aweme/v1/play/?video_id=%s&amp;line=0&amp;is_play_url=1&amp;source&#x27;</span> \</span><br><span class="line">                  <span class="string">&#x27;=PackSourceEnum_AWEME_DETAIL&#x27;</span> % vid</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                dow_url = get_shorten(url)</span><br><span class="line">            <span class="keyword">except</span> Exception:</span><br><span class="line">                dow_url = url</span><br><span class="line"></span><br><span class="line">        desc = data_list[<span class="string">&#x27;desc&#x27;</span>]</span><br><span class="line">        author = data_list[<span class="string">&#x27;author&#x27;</span>][<span class="string">&#x27;nickname&#x27;</span>]</span><br><span class="line">        sex = <span class="string">&quot;男&quot;</span> <span class="keyword">if</span> data_list[<span class="string">&#x27;author&#x27;</span>][<span class="string">&#x27;gender&#x27;</span>] == <span class="number">1</span> <span class="keyword">else</span> <span class="string">&quot;女&quot;</span> <span class="keyword">if</span> data_list[<span class="string">&#x27;author&#x27;</span>][<span class="string">&#x27;gender&#x27;</span>] == <span class="number">2</span> <span class="keyword">else</span> <span class="string">&quot;未知&quot;</span></span><br><span class="line">        music = data_list[<span class="string">&#x27;music&#x27;</span>][<span class="string">&#x27;play_url&#x27;</span>][<span class="string">&#x27;uri&#x27;</span>]</span><br><span class="line">        <span class="keyword">await</span> douyin.send(<span class="string">&#x27;%s.播主：%s  性别：%s\n作品类型：%s\n标题：%s%s\n音频地址：%s\n下载地址：%s&#x27;</span> % (</span><br><span class="line">            i, author, sex, aweme_type, desc, duration, music, dow_url))</span><br><span class="line">    <span class="comment"># await douyin.finish(MessageSegment.video(file=ret, timeout=5))</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">dyadd = on_command(<span class="string">&quot;dyget&quot;</span>, aliases=&#123;<span class="string">&quot;记录美好生活&quot;</span>, <span class="string">&quot;我要学习&quot;</span>, <span class="string">&quot;我爱学习&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@dyadd.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">event: GroupMessageEvent</span>):</span><br><span class="line">    gid = <span class="built_in">str</span>(event.group_id)</span><br><span class="line">    funcs_status = (<span class="keyword">await</span> load(_path))</span><br><span class="line">    <span class="keyword">if</span> funcs_status == <span class="literal">None</span>:</span><br><span class="line">        <span class="keyword">await</span> dyadd.finish(<span class="string">&quot;本群当前无数据，请先添加作者链接&quot;</span>)</span><br><span class="line"></span><br><span class="line">    url_list = funcs_status.get(gid, <span class="literal">None</span>)</span><br><span class="line">    <span class="keyword">if</span> url_list:</span><br><span class="line">        <span class="comment"># num = funcs_status.get(&#x27;num&#x27;, None) # 播主的索引</span></span><br><span class="line">        <span class="comment"># 保证下次随机的播主绝不和上次的一样 这里 -2 就行了 因为每次更新字典都会跑到最后我们躲避最后一个就不可能会取到她拉</span></span><br><span class="line">        <span class="comment"># 当然这个作者数少于2肯定会有异常的 我们做个异常处理</span></span><br><span class="line">        <span class="comment"># num = len(url_list)</span></span><br><span class="line">        <span class="comment"># try:</span></span><br><span class="line">        <span class="comment">#     num1 = random.randint(0, num - 2)</span></span><br><span class="line">        <span class="comment"># except Exception:</span></span><br><span class="line">        <span class="comment">#     num1 = 0</span></span><br><span class="line">        <span class="comment"># while num:</span></span><br><span class="line">        <span class="comment">#     if num != num1:</span></span><br><span class="line">        <span class="comment">#         break</span></span><br><span class="line">        <span class="comment">#     else:</span></span><br><span class="line">        <span class="comment">#         num1 = random.randint(0, len(url_list) - 1)</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 其实直接不做随机 这样等于排队一样 第一个结束后在最后 第二个变成第一个以此类推 所以我们一直取第1个就好了</span></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&#x27;user-agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)&#x27;</span></span><br><span class="line">                          <span class="string">&#x27;Chrome/111.0.0.0 Safari/537.36&#x27;</span></span><br><span class="line">        &#125;</span><br><span class="line">        num1 = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">        url = url_list[num1][<span class="string">&#x27;url&#x27;</span>]</span><br><span class="line">        num2 = url_list[num1].get(<span class="string">&#x27;id&#x27;</span>, <span class="literal">None</span>)  <span class="comment"># 播主作品的索引</span></span><br><span class="line">        ret = requests.get(url, allow_redirects=<span class="literal">False</span>, headers=headers)</span><br><span class="line">        sec_uid = ret.headers[<span class="string">&#x27;Location&#x27;</span>]</span><br><span class="line">        ts = <span class="built_in">str</span>(time.time()).split(<span class="string">&#x27;.&#x27;</span>)[<span class="number">0</span>]</span><br><span class="line">        header = &#123;</span><br><span class="line">            <span class="string">&#x27;cid&#x27;</span>: <span class="string">&#x27;d9ba8ae07d955b83c3b04280f3dc5a4a&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;timestamp&#x27;</span>: ts,</span><br><span class="line">            <span class="string">&#x27;user-agent&#x27;</span>: <span class="string">&#x27;okhttp/3.10.0.12&#x27;</span></span><br><span class="line">        &#125;</span><br><span class="line">        res = requests.post(<span class="string">&quot;http://api2.52jan.com/dyapi/get_cookie/v2&quot;</span>, data=&#123;<span class="string">&quot;sign&quot;</span>: set_sign()&#125;,</span><br><span class="line">                            headers=header).json()</span><br><span class="line"></span><br><span class="line">        headers[<span class="string">&#x27;cookie&#x27;</span>] = res[<span class="string">&#x27;data&#x27;</span>][<span class="number">0</span>][<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line">        ret = requests.get(sec_uid, headers=headers).text</span><br><span class="line">        data = re.search(</span><br><span class="line">            <span class="string">r&#x27;&lt;script id=&quot;RENDER_DATA&quot; type=&quot;application/json&quot;&gt;(.*?)%22post%22%3A%7B%22(.*?)%2C%22_location&#x27;</span>,</span><br><span class="line">            ret).group(<span class="number">2</span>)</span><br><span class="line">        data_json = json.loads(<span class="string">&#x27;&#123;&quot;post&quot;:&#123;&quot;&#x27;</span> + urllib.parse.unquote(data))</span><br><span class="line">        aweme_list = data_json[<span class="string">&#x27;post&#x27;</span>][<span class="string">&#x27;data&#x27;</span>]</span><br><span class="line">        num3 = random.randint(<span class="number">0</span>, <span class="built_in">len</span>(aweme_list) - <span class="number">1</span>)</span><br><span class="line">        <span class="comment"># 保证下次随机的播主作品绝不和上次的一样</span></span><br><span class="line">        <span class="keyword">while</span> num2:</span><br><span class="line">            <span class="keyword">if</span> num2 != num3:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                num3 = random.randint(<span class="number">0</span>, <span class="built_in">len</span>(aweme_list) - <span class="number">1</span>)</span><br><span class="line">        aweme_list = aweme_list[num3]</span><br><span class="line">        <span class="keyword">if</span> aweme_list[<span class="string">&#x27;awemeType&#x27;</span>] == <span class="number">2</span>:</span><br><span class="line">            duration = <span class="string">&#x27;&#x27;</span></span><br><span class="line">            aweme_type = <span class="string">&#x27;图集&#x27;</span></span><br><span class="line">            dow_url = <span class="string">&#x27;&#x27;</span></span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> aweme_list[<span class="string">&#x27;images&#x27;</span>]:</span><br><span class="line">                dow_url += i[<span class="string">&#x27;url_list&#x27;</span>][<span class="number">0</span>] + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            aweme_type = <span class="string">&#x27;视频&#x27;</span></span><br><span class="line">            duration = <span class="string">&#x27;\n视频时长：&#x27;</span> + <span class="built_in">str</span>(<span class="built_in">round</span>(aweme_list[<span class="string">&#x27;video&#x27;</span>][<span class="string">&#x27;duration&#x27;</span>] / <span class="number">1000</span>, <span class="number">1</span>)) + <span class="string">&#x27;秒&#x27;</span></span><br><span class="line">            uri = aweme_list[<span class="string">&#x27;video&#x27;</span>][<span class="string">&#x27;uri&#x27;</span>]</span><br><span class="line">            _url = <span class="string">&#x27;https://www.douyin.com/aweme/v1/play/?video_id=%s&amp;line=0&amp;is_play_url=1&amp;source&#x27;</span> \</span><br><span class="line">                   <span class="string">&#x27;=PackSourceEnum_PUBLISH&amp;aid=6383&#x27;</span> % uri</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                dow_url = get_shorten(_url)</span><br><span class="line">            <span class="keyword">except</span> Exception:</span><br><span class="line">                dow_url = _url</span><br><span class="line"></span><br><span class="line">        <span class="comment"># video_url = aweme_list[&#x27;video&#x27;][&#x27;play_addr_lowbr&#x27;][&#x27;url_list&#x27;][0]</span></span><br><span class="line">        author = aweme_list[<span class="string">&#x27;authorInfo&#x27;</span>][<span class="string">&#x27;nickname&#x27;</span>]</span><br><span class="line">        desc = aweme_list[<span class="string">&#x27;desc&#x27;</span>]</span><br><span class="line">        fans = aweme_list[<span class="string">&#x27;authorInfo&#x27;</span>][<span class="string">&#x27;followerCount&#x27;</span>]</span><br><span class="line">        is_top = <span class="string">&quot;是&quot;</span> <span class="keyword">if</span> aweme_list[<span class="string">&#x27;tag&#x27;</span>][<span class="string">&#x27;isTop&#x27;</span>] <span class="keyword">is</span> <span class="literal">True</span> <span class="keyword">else</span> <span class="string">&quot;否&quot;</span></span><br><span class="line">        <span class="comment"># music = aweme_list[&#x27;video&#x27;][&#x27;play_addr&#x27;][&#x27;uri&#x27;]</span></span><br><span class="line">        gid_list = url_list[num1]</span><br><span class="line">        url_list.remove(gid_list)</span><br><span class="line">        gid_list.update(&#123;<span class="string">&#x27;id&#x27;</span>: num3&#125;)</span><br><span class="line">        url_list.append(gid_list)</span><br><span class="line">        <span class="comment"># funcs_status.update(&#123;&#x27;num&#x27;: num1&#125;)</span></span><br><span class="line">        <span class="keyword">await</span> upload(_path, funcs_status)</span><br><span class="line">        <span class="keyword">await</span> dyadd.finish(</span><br><span class="line">            <span class="string">&#x27;播主：%s   粉丝数：%s\n是否置顶：%s\n作品类型：%s   是播主的第%s个作品\n作品标题：%s%s\n下载地址：%s&#x27;</span> % (</span><br><span class="line">                author, fans, is_top, aweme_type, <span class="built_in">str</span>(num3 + <span class="number">1</span>), desc, duration, dow_url))</span><br><span class="line">        <span class="comment"># await dyadd.finish(MessageSegment.video(file=video_url, timeout=5) + video_url)</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">await</span> dyadd.finish(<span class="string">&quot;本群当前无数据，请先添加作者链接&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_video_info</span>(<span class="params">video_list: <span class="built_in">str</span></span>):</span><br><span class="line">    url = <span class="string">&quot;http://api2.52jan.com/video_info&quot;</span></span><br><span class="line">    ret = requests.post(url, data=&#123;<span class="string">&quot;video_list&quot;</span>: <span class="string">&quot;&quot;</span>.join(<span class="built_in">str</span>(video_list))&#125;).json()</span><br><span class="line">    <span class="keyword">return</span> ret</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">set_sign</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    计算api签名</span></span><br><span class="line"><span class="string">    :return:</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    ts = <span class="built_in">str</span>(time.time()).split(<span class="string">&#x27;.&#x27;</span>)[<span class="number">0</span>]</span><br><span class="line">    string = <span class="string">&#x27;1005d9ba8ae07d955b83c3b04280f3dc5a4a&#x27;</span> + ts + get_appkey()</span><br><span class="line">    sign = hashlib.md5(string.encode(<span class="string">&#x27;utf8&#x27;</span>)).hexdigest()</span><br><span class="line">    <span class="keyword">return</span> sign</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_appkey</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    获取appkey</span></span><br><span class="line"><span class="string">    :return:</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    data = <span class="string">&#x27;d9ba8ae07d955b83c3b04280f3dc5a4a5c6b8r9a&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> hashlib.sha256(data.encode(<span class="string">&#x27;utf-8&#x27;</span>)).hexdigest()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_str_btw</span>(<span class="params">s, f, b</span>):</span><br><span class="line">    par = s.partition(f)</span><br><span class="line">    <span class="keyword">return</span> (par[<span class="number">2</span>].partition(b))[<span class="number">0</span>][:]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_shorten</span>(<span class="params">url</span>):</span><br><span class="line">    header = &#123;<span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;com.ss.android.ugc.aweme/700 (Linux; U; Android 7.1.2; zh_CN; SM-G955F; Build/JLS36C; &#x27;</span></span><br><span class="line">                            <span class="string">&#x27;Cronet/58.0.2991.0)&#x27;</span>&#125;</span><br><span class="line">    link = <span class="string">&#x27;https://lf-hl.snssdk.com/shorten/?target=&#123;0&#125;&amp;belong=aweme&amp;persist=0&amp;os_api=25&amp;device_type=SM-G955F&amp;&#x27;</span> \</span><br><span class="line">           <span class="string">&#x27;ssmix=a&amp;manifest_version_code=700&amp;dpi=240&#x27;</span> \</span><br><span class="line">           <span class="string">&#x27;&amp;js_sdk_version=1.19.2.0&amp;uuid=869120805765976&amp;app_name=aweme&amp;version_name=7.0.0&amp;ts=1658322005&amp;ac=wifi&#x27;</span> \</span><br><span class="line">           <span class="string">&#x27;&amp;app_type=normal&amp;channel=aweme_360&amp;update_version_code=7002&amp;_rticket=1658322005000&amp;device_platform&#x27;</span> \</span><br><span class="line">           <span class="string">&#x27;=android&amp;iid=3558489818144814&amp;version_code=700&amp;openudid=ea2310dc62938f1e&amp;device_id=2854802376098695&#x27;</span> \</span><br><span class="line">           <span class="string">&#x27;&amp;resolution=720*1280&amp;device_brand=samsung&amp;language=zh&amp;os_version=7.1.2&amp;aid=1128&amp;mcc_mnc=46007&#x27;</span>.<span class="built_in">format</span>(url)</span><br><span class="line">    ret = requests.get(link, headers=header).json()</span><br><span class="line">    <span class="keyword">return</span> ret[<span class="string">&#x27;data&#x27;</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">dydel = on_command(<span class="string">&quot;dydel&quot;</span>, aliases=&#123;<span class="string">&quot;抖音删除&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@dydel.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">event: GroupMessageEvent, state: T_State</span>):</span><br><span class="line">    gid = <span class="built_in">str</span>(event.group_id)</span><br><span class="line">    user_input_func_name = <span class="built_in">str</span>(state[<span class="string">&#x27;_prefix&#x27;</span>][<span class="string">&#x27;command_arg&#x27;</span>])</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(user_input_func_name) != <span class="number">29</span>:</span><br><span class="line">        <span class="keyword">await</span> dydel.finish(<span class="string">&quot;请输入待删除的29位作者主页短链&quot;</span>)</span><br><span class="line">    funcs_status = (<span class="keyword">await</span> load(_path))</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        url_list = funcs_status[gid]</span><br><span class="line">    <span class="keyword">except</span> Exception:</span><br><span class="line">        url_list = []</span><br><span class="line">        <span class="keyword">await</span> dydel.finish(<span class="string">&quot;被删除的内容不存在&quot;</span>)</span><br><span class="line">    n = <span class="number">0</span></span><br><span class="line">    idel = <span class="literal">False</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> url_list:</span><br><span class="line">        <span class="keyword">if</span> i[<span class="string">&#x27;url&#x27;</span>] == user_input_func_name:</span><br><span class="line">            idel = <span class="literal">True</span></span><br><span class="line">            url_list.pop(n)</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        n += <span class="number">1</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> idel:</span><br><span class="line">        <span class="keyword">await</span> dydel.finish(<span class="string">&quot;被删除的内容不存在&quot;</span>)</span><br><span class="line">    _val = &#123;gid: url_list&#125;</span><br><span class="line">    funcs_status.update(_val)</span><br><span class="line">    <span class="keyword">await</span> upload(_path, funcs_status)</span><br><span class="line">    <span class="keyword">await</span> dydel.finish(<span class="string">&quot;已成功删除[%s]&quot;</span> % user_input_func_name)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">dyadd = on_command(<span class="string">&quot;dyadd&quot;</span>, aliases=&#123;<span class="string">&quot;抖音添加&quot;</span>, <span class="string">&quot;dyset&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@dyadd.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">event: GroupMessageEvent, state: T_State</span>):</span><br><span class="line">    gid = <span class="built_in">str</span>(event.group_id)</span><br><span class="line">    user_input_func_name = <span class="built_in">str</span>(state[<span class="string">&#x27;_prefix&#x27;</span>][<span class="string">&#x27;command_arg&#x27;</span>])</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(user_input_func_name) != <span class="number">29</span>:</span><br><span class="line">        <span class="keyword">await</span> dyadd.finish(<span class="string">&quot;请输入29位作者主页短链&quot;</span>)</span><br><span class="line">    ret = requests.get(user_input_func_name, allow_redirects=<span class="literal">False</span>, headers=header)</span><br><span class="line">    location = ret.headers[<span class="string">&#x27;Location&#x27;</span>]</span><br><span class="line">    <span class="keyword">if</span> <span class="string">&#x27;user&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> location:</span><br><span class="line">        <span class="keyword">await</span> dyadd.finish(<span class="string">&quot;检测到输入的链接不是作者主页短链&quot;</span>)</span><br><span class="line">    funcs_status = (<span class="keyword">await</span> load(_path))</span><br><span class="line">    gg = []</span><br><span class="line">    <span class="keyword">if</span> funcs_status != <span class="literal">None</span>:</span><br><span class="line">        key = funcs_status</span><br><span class="line">        url_list = key.get(gid, <span class="literal">None</span>)</span><br><span class="line">        <span class="keyword">if</span> url_list:</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> url_list:</span><br><span class="line">                <span class="keyword">if</span> user_input_func_name <span class="keyword">in</span> i[<span class="string">&#x27;url&#x27;</span>]:</span><br><span class="line">                    <span class="keyword">await</span> dyadd.finish(<span class="string">&quot;该作者已存在，请勿重复添加&quot;</span>)</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">for</span> n <span class="keyword">in</span> key[gid]:</span><br><span class="line">                gg.append(n)</span><br><span class="line">            kk = &#123;<span class="string">&quot;url&quot;</span>: user_input_func_name&#125;</span><br><span class="line">            gg.append(kk)</span><br><span class="line">            _val = &#123;gid: gg&#125;</span><br><span class="line">            key.update(_val)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            kk = &#123;<span class="string">&quot;url&quot;</span>: user_input_func_name&#125;</span><br><span class="line">            gg.append(kk)</span><br><span class="line">            _val = &#123;gid: gg&#125;</span><br><span class="line">            key.update(_val)</span><br><span class="line">        <span class="keyword">await</span> upload(_path, key)</span><br><span class="line">        <span class="keyword">await</span> dyadd.finish(<span class="string">&quot;抖音作者主页添加成功&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        kk = &#123;<span class="string">&quot;url&quot;</span>: user_input_func_name&#125;</span><br><span class="line">        gg.append(kk)</span><br><span class="line">        _val = &#123;gid: gg&#125;</span><br><span class="line">        <span class="keyword">await</span> upload(_path, _val)</span><br><span class="line">        <span class="keyword">await</span> dyadd.finish(<span class="string">&quot;抖音作者主页添加成功&quot;</span>)</span><br></pre></td></tr></table></figure><h1 id="必应壁纸插件"><a href="#必应壁纸插件" class="headerlink" title="必应壁纸插件"></a>必应壁纸插件</h1><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>默认4K高清</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>支持7天以上壁纸</p>            </div><ul><li>我只是借用别人的网站来存下图片id而已怎么能说是爬虫呢</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> CommandArg</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11 <span class="keyword">import</span> Message</span><br><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"><span class="keyword">from</span> lxml <span class="keyword">import</span> etree</span><br><span class="line"></span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;必应每日一图&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.2&#x27;</span></span><br><span class="line">__usage__ = <span class="string">&#x27;命令/bing/必应壁纸&lt;参数：1=今天-1天=昨天 默认0=今天&gt;支持获取7天以上的壁纸&#x27;</span></span><br><span class="line"></span><br><span class="line">bing = on_command(<span class="string">&quot;bing&quot;</span>, aliases=&#123;<span class="string">&quot;Bing&quot;</span>, <span class="string">&quot;BING&quot;</span>, <span class="string">&quot;壁纸&quot;</span>, <span class="string">&quot;必应壁纸&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"><span class="meta">@bing.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_first_receive</span>(<span class="params">args: nonebot.adapters.Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    day = args.extract_plain_text()</span><br><span class="line">    days = <span class="number">0</span></span><br><span class="line">    <span class="keyword">if</span> day:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            days = <span class="built_in">int</span>(day)</span><br><span class="line">        <span class="keyword">except</span> ValueError:</span><br><span class="line">            <span class="keyword">await</span> bing.finish(<span class="string">&quot;参数错误，必须为数字默认为0取当天的壁纸&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        days = <span class="number">0</span></span><br><span class="line">    img_report, copyright, date = <span class="keyword">await</span> get_bing(<span class="literal">True</span>, days)</span><br><span class="line">    <span class="keyword">if</span> date != <span class="string">&#x27;&#x27;</span>:</span><br><span class="line">        st = <span class="built_in">list</span>(date)</span><br><span class="line">        st.insert(<span class="number">4</span>, <span class="string">&#x27;.&#x27;</span>)</span><br><span class="line">        st.insert(<span class="number">7</span>, <span class="string">&#x27;.&#x27;</span>)</span><br><span class="line">        date = <span class="string">&#x27;&#x27;</span>.join(st)</span><br><span class="line"></span><br><span class="line">    txt = <span class="string">&#x27;\n--来自：今日必应壁纸&#x27;</span> <span class="keyword">if</span> days == <span class="number">0</span> <span class="keyword">else</span> <span class="string">&#x27;\n--来自：&#123;0&#125;天前的必应壁纸&#x27;</span>.<span class="built_in">format</span>(days) <span class="keyword">if</span> days &lt;= <span class="number">30</span> <span class="keyword">else</span> <span class="string">&#x27;\n--来自：&#123;0&#125;的必应壁纸&#x27;</span>.<span class="built_in">format</span>(date)</span><br><span class="line">    url = <span class="string">&quot;[CQ:image,file=&quot;</span>+img_report+<span class="string">&quot;]&quot;</span></span><br><span class="line">    <span class="keyword">await</span> bing.finish(Message(url) + copyright + txt)</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">get_bingbz</span>(<span class="params">day</span>):</span><br><span class="line">    now = datetime.datetime.now()</span><br><span class="line">    days = datetime.timedelta(days=day)</span><br><span class="line">    _days = now - days</span><br><span class="line">    _date = <span class="built_in">str</span>(_days.year)+<span class="built_in">str</span>(_days.month).zfill(<span class="number">2</span>)+<span class="built_in">str</span>(_days.day).zfill(<span class="number">2</span>) <span class="comment"># 计算x天前的时间</span></span><br><span class="line">    _page = <span class="number">1</span> <span class="keyword">if</span> (day % <span class="number">16</span>) != <span class="number">0</span> <span class="keyword">else</span> <span class="number">0</span> <span class="comment"># 计算x天前在第几页，一页16个</span></span><br><span class="line">    page = <span class="built_in">int</span>(day / <span class="number">16</span>) + _page</span><br><span class="line">    url = <span class="string">&#x27;https://bing.xinac.net/?page=&#123;&#125;&#x27;</span>.<span class="built_in">format</span>(page)</span><br><span class="line">    ret = requests.get(url, headers=&#123;<span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (&#x27;</span></span><br><span class="line">                                                   <span class="string">&#x27;KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36&#x27;</span>&#125;)</span><br><span class="line">    <span class="keyword">if</span> ret.status_code == <span class="number">200</span>:</span><br><span class="line">        soup = etree.HTML(ret.text)</span><br><span class="line">        <span class="comment"># //*[@id=&quot;view_photoList&quot;]/div[1]/div[1]/article/div[1]/a/div/img</span></span><br><span class="line">        _post = soup.xpath(<span class="string">&#x27;//*[@id=&quot;view_photoList&quot;]//div/img/@data-date&#x27;</span>)</span><br><span class="line">        _url = soup.xpath(<span class="string">&#x27;//*[@id=&quot;view_photoList&quot;]//div/img/@src&#x27;</span>)</span><br><span class="line">        _alt = soup.xpath(<span class="string">&#x27;//*[@id=&quot;view_photoList&quot;]//div/img/@alt&#x27;</span>)</span><br><span class="line">        n = <span class="number">0</span></span><br><span class="line">        <span class="keyword">if</span> _date <span class="keyword">in</span> _post: <span class="comment"># 这里其实不用判断的 因为上面时间已经判断过了 但是保险起见嘛 无所谓</span></span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> _post:</span><br><span class="line">                <span class="keyword">if</span> i == _date:</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line">                n += <span class="number">1</span></span><br><span class="line">            res = <span class="keyword">await</span> get_str_btw(_url[n], <span class="string">&#x27;id=&#x27;</span>, <span class="string">&#x27;_400x240&#x27;</span>)</span><br><span class="line">            copyright = _alt[n]</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            res = <span class="string">&#x27;反正是失败了，&#x27;</span></span><br><span class="line">            copyright = <span class="string">&#x27;不知道原因知道也不告诉你！&#x27;</span></span><br><span class="line">        <span class="keyword">return</span> res, copyright, _date</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">get_bing</span>(<span class="params">uhd=<span class="literal">False</span>, day=<span class="number">0</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    :param uhd:是否4k 默认否</span></span><br><span class="line"><span class="string">    :param day: 0=今天 +1就是前一天</span></span><br><span class="line"><span class="string">    :return:</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    date = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> day &gt; <span class="number">7</span>:</span><br><span class="line">        img, copyright, date = <span class="keyword">await</span> get_bingbz(day)</span><br><span class="line">        url = <span class="string">&#x27;https://cn.bing.com/th?id=&#x27;</span> + img</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> uhd:</span><br><span class="line">            img = url + <span class="string">&#x27;_1920x1080.jpg&#x27;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            img = url + <span class="string">&#x27;_UHD.jpg&#x27;</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        url = <span class="string">&#x27;https://cn.bing.com/HPImageArchive.aspx?format=js&amp;idx=&#123;0&#125;&amp;n=1&#x27;</span>.<span class="built_in">format</span>(day)</span><br><span class="line">        ret = requests.get(url).json()</span><br><span class="line">        img = ret[<span class="string">&#x27;images&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;url&#x27;</span>]</span><br><span class="line">        copyright = ret[<span class="string">&#x27;images&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;copyright&#x27;</span>]</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> uhd:</span><br><span class="line">            img = <span class="string">&#x27;https://cn.bing.com&#x27;</span> + img</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            img = <span class="string">&#x27;https://cn.bing.com/th?id=&#x27;</span> + <span class="keyword">await</span> get_str_btw(img, <span class="string">&#x27;id=&#x27;</span>, <span class="string">&#x27;_1920x1080&#x27;</span>) + <span class="string">&#x27;_UHD.jpg&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> img, copyright, date</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">get_str_btw</span>(<span class="params">s, f, b</span>):</span><br><span class="line">    par = s.partition(f)</span><br><span class="line">    <span class="keyword">return</span> (par[<span class="number">2</span>].partition(b))[<span class="number">0</span>][:]</span><br></pre></td></tr></table></figure><h1 id="历史上的今天"><a href="#历史上的今天" class="headerlink" title="历史上的今天"></a>历史上的今天</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line">__plugin_meta__ = nonebot.plugin.PluginMetadata(</span><br><span class="line">    name=<span class="string">&#x27;历史上的今天&#x27;</span>,</span><br><span class="line">    description=<span class="string">&#x27;查询历史上的今天&#x27;</span>,</span><br><span class="line">    usage=<span class="string">&#x27;&#x27;&#x27;命令/历史&lt;参数：无&gt;&#x27;&#x27;&#x27;</span>,</span><br><span class="line">    extra=&#123;<span class="string">&#x27;version&#x27;</span>: <span class="string">&#x27;1.0&#x27;</span>&#125;</span><br><span class="line">)</span><br><span class="line">__help_version__ = <span class="string">&#x27;1.0&#x27;</span></span><br><span class="line"></span><br><span class="line">history = on_command(<span class="string">&quot;history&quot;</span>, aliases=&#123;<span class="string">&quot;历史&quot;</span>, <span class="string">&quot;历史上的今天&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"><span class="meta">@history.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_first_receive</span>():</span><br><span class="line">    ret = <span class="keyword">await</span> get_history()</span><br><span class="line">    <span class="keyword">await</span> history.finish(ret)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">get_history</span>():</span><br><span class="line">    times = datetime.now()</span><br><span class="line">    day = <span class="built_in">str</span>(times.day)</span><br><span class="line">    day = day.zfill(<span class="number">2</span>)</span><br><span class="line">    month = <span class="built_in">str</span>(times.month)</span><br><span class="line">    month = month.zfill(<span class="number">2</span>)</span><br><span class="line">    url = <span class="string">&#x27;https://baike.baidu.com/cms/home/eventsOnHistory/&#123;0&#125;.json&#x27;</span>.<span class="built_in">format</span>(month)</span><br><span class="line">    ret = requests.get(url, headers=&#123;</span><br><span class="line">        <span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0&#x27;</span>&#125;).json()</span><br><span class="line">    <span class="comment"># print(ret)</span></span><br><span class="line">    txt = ret[month][month + day]</span><br><span class="line">    txt = txt[random.randint(<span class="number">0</span>, <span class="built_in">len</span>(txt) - <span class="number">1</span>)]</span><br><span class="line">    txt = <span class="built_in">eval</span>(re.sub(<span class="string">r&#x27;&lt;/?\w+[^&gt;]*&gt;&#x27;</span>, <span class="string">&#x27;&#x27;</span>, <span class="built_in">str</span>(txt)))</span><br><span class="line">    <span class="comment"># data = &#123;</span></span><br><span class="line">    <span class="comment">#     &quot;type&quot;: &quot;share&quot;,</span></span><br><span class="line">    <span class="comment">#     &quot;data&quot;: &#123;</span></span><br><span class="line">    <span class="comment">#         &quot;url&quot;: txt[&#x27;link&#x27;],</span></span><br><span class="line">    <span class="comment">#         &quot;title&quot;: txt[&#x27;year&#x27;] + &#x27;年&#x27; + month + &#x27;月&#x27; + day + &#x27;日，&#x27; + txt[&#x27;title&#x27;]</span></span><br><span class="line">    <span class="comment">#     &#125;</span></span><br><span class="line">    <span class="comment"># &#125;</span></span><br><span class="line"></span><br><span class="line">    data = txt[<span class="string">&#x27;year&#x27;</span>] + <span class="string">&#x27;年&#x27;</span> + month + <span class="string">&#x27;月&#x27;</span> + day + <span class="string">&#x27;日\n&#x27;</span> + txt[<span class="string">&#x27;title&#x27;</span>] + <span class="string">&#x27;\n详情点击：&#x27;</span> + txt[<span class="string">&#x27;link&#x27;</span>]</span><br><span class="line">    <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line">    <span class="comment"># for i in ret[month][month + day]:</span></span><br><span class="line">    <span class="comment">#     n = eval(re.sub(r&#x27;&lt;/?\w+[^&gt;]*&gt;&#x27;, &#x27;&#x27;, str(i)))</span></span><br><span class="line">    <span class="comment">#     print(n[&#x27;year&#x27;] + &#x27;年&#x27; + month + &#x27;月&#x27; + day + &#x27;日，&#x27; + n[&#x27;title&#x27;])</span></span><br><span class="line">    <span class="comment">#     print(n[&#x27;link&#x27;])</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="网易新闻插件"><a href="#网易新闻插件" class="headerlink" title="网易新闻插件"></a>网易新闻插件</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters <span class="keyword">import</span> Message</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> CommandArg</span><br><span class="line">__plugin_meta__ = nonebot.plugin.PluginMetadata(</span><br><span class="line">    name=<span class="string">&#x27;新闻&#x27;</span>,</span><br><span class="line">    description=<span class="string">&#x27;获取网易热点新闻&#x27;</span>,</span><br><span class="line">    usage=<span class="string">&#x27;&#x27;&#x27;命令/news&lt;参数：数量 默认10&gt;&#x27;&#x27;&#x27;</span>,</span><br><span class="line">    extra=&#123;<span class="string">&#x27;version&#x27;</span>: <span class="string">&#x27;1.0&#x27;</span>&#125;</span><br><span class="line">)</span><br><span class="line">__help_version__ = <span class="string">&#x27;1.0&#x27;</span></span><br><span class="line"></span><br><span class="line">news = on_command(<span class="string">&quot;news&quot;</span>, aliases=&#123;<span class="string">&quot;新闻&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"><span class="meta">@news.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_first_receive</span>(<span class="params">args: Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    plain_text = args.extract_plain_text()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> plain_text:</span><br><span class="line">        plain_text = <span class="string">&#x27;10&#x27;</span></span><br><span class="line">    url = <span class="string">&#x27;http://c.3g.163.com/nc/article/list/T1467284926140/0-20.html&#x27;</span></span><br><span class="line">    ret = requests.get(url).json()</span><br><span class="line">    n = <span class="number">0</span></span><br><span class="line">    msg = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> ret[<span class="string">&#x27;T1467284926140&#x27;</span>]:</span><br><span class="line">        title = i[<span class="string">&#x27;title&#x27;</span>]</span><br><span class="line">        n += <span class="number">1</span></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">int</span>(plain_text) &gt; <span class="number">10</span>:</span><br><span class="line">            msg = <span class="built_in">str</span>(n) + <span class="string">&#x27;.&#x27;</span> + title + <span class="string">&#x27;--来源：&#x27;</span> + i[<span class="string">&#x27;source&#x27;</span>] + <span class="string">&#x27;，时间：&#x27;</span> + i[<span class="string">&#x27;mtime&#x27;</span>] + <span class="string">&#x27;\n&#x27;</span> + <span class="string">&#x27;详情：&#x27;</span> + i[<span class="string">&#x27;url&#x27;</span>]</span><br><span class="line">            <span class="keyword">await</span> news.send(msg)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            msg += <span class="built_in">str</span>(n) + <span class="string">&#x27;.&#x27;</span> + title + <span class="string">&#x27;--来源：&#x27;</span> + i[<span class="string">&#x27;source&#x27;</span>] + <span class="string">&#x27;，时间：&#x27;</span> + i[<span class="string">&#x27;mtime&#x27;</span>] + <span class="string">&#x27;\n&#x27;</span> + <span class="string">&#x27;详情：&#x27;</span> + i[<span class="string">&#x27;url&#x27;</span>] + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">int</span>(n) &gt;= <span class="built_in">int</span>(plain_text):</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">int</span>(plain_text) &lt;= <span class="number">10</span>:</span><br><span class="line">        <span class="keyword">await</span> news.finish(msg)</span><br></pre></td></tr></table></figure><h1 id="gping插件"><a href="#gping插件" class="headerlink" title="gping插件"></a>gping插件</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> select</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters <span class="keyword">import</span> Message</span><br><span class="line"><span class="keyword">from</span> nonebot.matcher <span class="keyword">import</span> Matcher</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> Arg, CommandArg, ArgPlainText</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line">__plugin_meta__ = nonebot.plugin.PluginMetadata(</span><br><span class="line">    name=<span class="string">&#x27;PING域名或IP&#x27;</span>,</span><br><span class="line">    description=<span class="string">&#x27;PING 域名或IP&#x27;</span>,</span><br><span class="line">    usage=<span class="string">&#x27;&#x27;&#x27;命令/ping&lt;参数：域名或IP&gt;&#x27;&#x27;&#x27;</span>,</span><br><span class="line">    extra=&#123;<span class="string">&#x27;version&#x27;</span>: <span class="string">&#x27;1.2&#x27;</span>&#125;</span><br><span class="line">)</span><br><span class="line">__help_version__ = <span class="string">&#x27;1.2&#x27;</span></span><br><span class="line"></span><br><span class="line">getping = on_command(<span class="string">&quot;ping&quot;</span>, aliases=&#123;<span class="string">&quot;Ping&quot;</span>, <span class="string">&quot;PING&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@getping.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_first_receive</span>(<span class="params">matcher: Matcher, args: Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    music_name = args.extract_plain_text()</span><br><span class="line">    <span class="keyword">if</span> music_name:</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;ips&quot;</span>, args)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@getping.got(<span class="params"><span class="string">&quot;ips&quot;</span>, prompt=<span class="string">&quot;你想ping的域名或ip是？&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">ips: Message = Arg(<span class="params"></span>), ip: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;ips&quot;</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> ip:</span><br><span class="line">        <span class="keyword">await</span> getping.reject(ips.template(<span class="string">&quot;ping的域名或ip为空&quot;</span>))</span><br><span class="line">    ret = <span class="keyword">await</span> ping(ip)</span><br><span class="line">    <span class="keyword">await</span> getping.finish(ret)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">chesksum</span>(<span class="params">data</span>):</span><br><span class="line">    n = <span class="built_in">len</span>(data)</span><br><span class="line">    m = n % <span class="number">2</span></span><br><span class="line">    <span class="built_in">sum</span> = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, n - m, <span class="number">2</span>):</span><br><span class="line">        <span class="built_in">sum</span> += (data[i]) + ((data[i + <span class="number">1</span>]) &lt;&lt; <span class="number">8</span>)  <span class="comment"># 传入data以每两个字节（十六进制）通过ord转十进制，第一字节在低位，第二个字节在高位</span></span><br><span class="line">    <span class="keyword">if</span> m:</span><br><span class="line">        <span class="built_in">sum</span> += (data[-<span class="number">1</span>])</span><br><span class="line">    <span class="comment"># 将高于16位与低16位相加</span></span><br><span class="line">    <span class="built_in">sum</span> = (<span class="built_in">sum</span> &gt;&gt; <span class="number">16</span>) + (<span class="built_in">sum</span> &amp; <span class="number">0xffff</span>)</span><br><span class="line">    <span class="built_in">sum</span> += (<span class="built_in">sum</span> &gt;&gt; <span class="number">16</span>)  <span class="comment"># 如果还有高于16位，将继续与低16位相加</span></span><br><span class="line">    answer = ~<span class="built_in">sum</span> &amp; <span class="number">0xffff</span></span><br><span class="line">    <span class="comment">#  主机字节序转网络字节序列（参考小端序转大端序）</span></span><br><span class="line">    answer = answer &gt;&gt; <span class="number">8</span> | (answer &lt;&lt; <span class="number">8</span> &amp; <span class="number">0xff00</span>)</span><br><span class="line">    <span class="keyword">return</span> answer</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">request_ping</span>(<span class="params">data_type, data_code, data_checksum, data_ID, data_Sequence, payload_body</span>):</span><br><span class="line">    <span class="comment">#  把字节打包成二进制数据</span></span><br><span class="line">    icmp_packet = struct.pack(<span class="string">&#x27;&gt;BBHHH32s&#x27;</span>, data_type, data_code, data_checksum, data_ID, data_Sequence, payload_body)</span><br><span class="line">    icmp_chesksum = <span class="keyword">await</span> chesksum(icmp_packet)  <span class="comment"># 获取校验和</span></span><br><span class="line">    <span class="comment">#  把校验和传入，再次打包</span></span><br><span class="line">    icmp_packet = struct.pack(<span class="string">&#x27;&gt;BBHHH32s&#x27;</span>, data_type, data_code, icmp_chesksum, data_ID, data_Sequence, payload_body)</span><br><span class="line">    <span class="keyword">return</span> icmp_packet</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">raw_socket</span>(<span class="params">dst_addr, icmp_packet</span>):</span><br><span class="line">    <span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">       连接套接字,并将数据发送到套接字</span></span><br><span class="line"><span class="string">    &#x27;&#x27;&#x27;</span></span><br><span class="line">    <span class="comment"># 实例化一个socket对象，ipv4，原套接字，分配协议端口</span></span><br><span class="line">    rawsocket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname(<span class="string">&quot;icmp&quot;</span>))</span><br><span class="line">    <span class="comment"># 记录当前请求时间</span></span><br><span class="line">    send_request_ping_time = time.time()</span><br><span class="line">    <span class="comment"># 发送数据到网络</span></span><br><span class="line">    rawsocket.sendto(icmp_packet, (dst_addr, <span class="number">80</span>))</span><br><span class="line">    <span class="comment"># 返回数据</span></span><br><span class="line">    <span class="keyword">return</span> send_request_ping_time, rawsocket, dst_addr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">reply_ping</span>(<span class="params">send_request_ping_time, rawsocket, data_Sequence, timeout=<span class="number">1</span></span>):</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="comment"># 开始时间</span></span><br><span class="line">        started_select = time.time()</span><br><span class="line">        <span class="comment"># 实例化select对象，可读rawsocket，可写为空，可执行为空，超时时间</span></span><br><span class="line">        what_ready = select.select([rawsocket], [], [], timeout)</span><br><span class="line">        <span class="comment"># 等待时间</span></span><br><span class="line">        wait_for_time = (time.time() - started_select)</span><br><span class="line">        <span class="comment"># 没有返回可读的内容，判断超时</span></span><br><span class="line">        <span class="keyword">if</span> what_ready[<span class="number">0</span>] == []:  <span class="comment"># Timeout</span></span><br><span class="line">            <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line">        <span class="comment"># 记录接收时间</span></span><br><span class="line">        time_received = time.time()</span><br><span class="line">        <span class="comment"># 设置接收的包的字节为1024</span></span><br><span class="line">        received_packet, addr = rawsocket.recvfrom(<span class="number">1024</span>)</span><br><span class="line">        <span class="comment"># 获取接收包的icmp头</span></span><br><span class="line">        <span class="comment"># print(icmpHeader)</span></span><br><span class="line">        icmpHeader = received_packet[<span class="number">20</span>:<span class="number">28</span>]</span><br><span class="line">        <span class="comment"># 反转编码</span></span><br><span class="line">        <span class="built_in">type</span>, code, checksum, packet_id, sequence = struct.unpack(</span><br><span class="line">            <span class="string">&quot;&gt;BBHHH&quot;</span>, icmpHeader</span><br><span class="line">        )</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">type</span> == <span class="number">0</span> <span class="keyword">and</span> sequence == data_Sequence:</span><br><span class="line">            <span class="keyword">return</span> time_received - send_request_ping_time</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 数据包的超时时间判断</span></span><br><span class="line">        timeout = timeout - wait_for_time</span><br><span class="line">        <span class="keyword">if</span> timeout &lt;= <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">ping</span>(<span class="params">host</span>):</span><br><span class="line">    ret = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    ss = re.match(<span class="string">r&#x27;((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d)(\.((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d))&#123;3&#125;&#x27;</span>, host)</span><br><span class="line">    <span class="keyword">if</span> ss <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(host) &lt;= <span class="number">9</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&#x27;别想了我不ping这个&#x27;</span></span><br><span class="line">    start_time = time.time()</span><br><span class="line">    send, accept, lost = <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span></span><br><span class="line">    sumtime, shorttime, longtime, avgtime = <span class="number">0</span>, <span class="number">1000</span>, <span class="number">0</span>, <span class="number">0</span></span><br><span class="line">    <span class="comment"># TODO icmp数据包的构建</span></span><br><span class="line">    data_type = <span class="number">8</span>  <span class="comment"># ICMP Echo Request</span></span><br><span class="line">    data_code = <span class="number">0</span>  <span class="comment"># must be zero</span></span><br><span class="line">    data_checksum = <span class="number">0</span>  <span class="comment"># &quot;...with value 0 substituted for this field...&quot;</span></span><br><span class="line">    data_ID = <span class="number">0</span>  <span class="comment"># Identifier</span></span><br><span class="line">    data_Sequence = <span class="number">1</span>  <span class="comment"># Sequence number</span></span><br><span class="line">    payload_body = <span class="string">b&#x27;abcdefghijklmnopqrstuvwabcdefghi&#x27;</span>  <span class="comment"># data</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 将主机名转ipv4地址格式，返回以ipv4地址格式的字符串，如果主机名称是ipv4地址，则它将保持不变</span></span><br><span class="line">    dst_addr = socket.gethostbyname(host)</span><br><span class="line">    <span class="keyword">if</span> host == <span class="string">&#x27;127.0.0.1&#x27;</span> <span class="keyword">or</span> host == <span class="string">&#x27;localhost&#x27;</span> <span class="keyword">or</span> dst_addr == <span class="string">&#x27;127.0.0.1&#x27;</span> <span class="keyword">or</span> dst_addr == <span class="string">&#x27;localhost&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;不能ping我&#x27;</span></span><br><span class="line">    ret += <span class="string">&quot;正在 Ping &#123;0&#125; [&#123;1&#125;] 具有 32 字节的数据:&quot;</span>.<span class="built_in">format</span>(host, dst_addr) + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="number">4</span>):</span><br><span class="line">        send = i + <span class="number">1</span></span><br><span class="line">        <span class="comment"># 请求ping数据包的二进制转换</span></span><br><span class="line">        icmp_packet = <span class="keyword">await</span> request_ping(data_type, data_code, data_checksum, data_ID, data_Sequence + i, payload_body)</span><br><span class="line">        <span class="comment"># 连接套接字,并将数据发送到套接字</span></span><br><span class="line">        send_request_ping_time, rawsocket, addr = <span class="keyword">await</span> raw_socket(dst_addr, icmp_packet)</span><br><span class="line">        <span class="comment"># 数据包传输时间</span></span><br><span class="line">        times = <span class="keyword">await</span> reply_ping(send_request_ping_time, rawsocket, data_Sequence + i)</span><br><span class="line">        <span class="keyword">if</span> times &gt; <span class="number">0</span>:</span><br><span class="line">            ret += <span class="string">&quot;来自 &#123;0&#125; 的回复: 字节=32 时间=&#123;1&#125;ms&quot;</span>.<span class="built_in">format</span>(addr, <span class="built_in">int</span>(times * <span class="number">1000</span>)) + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line"></span><br><span class="line">            accept += <span class="number">1</span></span><br><span class="line">            return_time = <span class="built_in">int</span>(times * <span class="number">1000</span>)</span><br><span class="line">            sumtime += return_time</span><br><span class="line">            <span class="keyword">if</span> return_time &gt; longtime:</span><br><span class="line">                longtime = return_time</span><br><span class="line">            <span class="keyword">if</span> return_time &lt; shorttime:</span><br><span class="line">                shorttime = return_time</span><br><span class="line">            <span class="comment"># time.sleep(0.2)</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            lost += <span class="number">1</span></span><br><span class="line">            ret += <span class="string">&quot;请求超时。\n&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> send == <span class="number">4</span>:</span><br><span class="line">            end_time = time.time()</span><br><span class="line">            ret += <span class="string">&quot;\t&#123;0&#125;的Ping统计信息:&quot;</span>.<span class="built_in">format</span>(dst_addr) + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">            ret += <span class="string">&quot;\t数据包：发送=&#123;0&#125;，接收=&#123;1&#125;，丢失=&#123;2&#125;（&#123;3&#125;%丢失）\n往返行程的估计时间（以毫秒为单位）：\n\t最短=&#123;4&#125;ms，最长=&#123;5&#125;ms，平均=&#123;6&#125;ms，ping耗时=&#123;7&#125;ms&quot;</span>.<span class="built_in">format</span>(</span><br><span class="line">                i + <span class="number">1</span>, accept, i + <span class="number">1</span> - accept, (i + <span class="number">1</span> - accept) / (i + <span class="number">1</span>) * <span class="number">100</span>, shorttime, longtime,</span><br><span class="line">                sumtime / send, <span class="built_in">round</span>((end_time - start_time) * <span class="number">1000</span>)) + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> ret</span><br></pre></td></tr></table></figure><h1 id="防疫政策查询插件"><a href="#防疫政策查询插件" class="headerlink" title="防疫政策查询插件"></a>防疫政策查询插件</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/7/13 5:43</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : yiqing.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">from</span> nonebot.matcher <span class="keyword">import</span> Matcher</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> Arg, CommandArg, ArgPlainText</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11 <span class="keyword">import</span> Message</span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;防疫政策查询&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.0&#x27;</span></span><br><span class="line">__usage__ = <span class="string">&#x27;命令/yiq/疫情&lt;参数：准备去的城市&gt;&#x27;</span></span><br><span class="line"></span><br><span class="line">yiqing = on_command(<span class="string">&quot;yiq&quot;</span>, aliases=&#123;<span class="string">&quot;疫情&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"><span class="meta">@yiqing.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_first_receive</span>(<span class="params">matcher: Matcher, args: Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    plain_text = args.extract_plain_text()</span><br><span class="line">    <span class="keyword">if</span> plain_text:</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;city&quot;</span>, args)</span><br><span class="line"></span><br><span class="line"><span class="meta">@yiqing.got(<span class="params"><span class="string">&quot;city&quot;</span>, prompt=<span class="string">&quot;你准备去哪个城市呢？&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">city: Message = Arg(<span class="params"></span>), city_name: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;city&quot;</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> city_name:</span><br><span class="line">        <span class="keyword">await</span> yiqing.reject(city.template(<span class="string">&quot;要查询的城市名称不能为空呢，请重新输入&quot;</span>))</span><br><span class="line">    <span class="keyword">await</span> yiqing.finish(ali_yiqing(city_name))</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">ali_yiqing</span>(<span class="params">city</span>):</span><br><span class="line">    url = <span class="string">&#x27;https://vt.sm.cn/api/QuarkGoNew/getHomeData?to=&#x27;</span> + city</span><br><span class="line">    ret = requests.get(url, headers=&#123;<span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36&#x27;</span>&#125;).json()</span><br><span class="line">    small = ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;to&#x27;</span>][<span class="string">&#x27;small&#x27;</span>].get(<span class="string">&#x27;coming_point_policy&#x27;</span>, <span class="literal">None</span>)</span><br><span class="line">    n = <span class="number">0</span></span><br><span class="line">    msg = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> small <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">        msg = <span class="string">&#x27;失败了，请重试&#x27;</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> small:</span><br><span class="line">            n += <span class="number">1</span></span><br><span class="line">            msg += <span class="built_in">str</span>(n) + <span class="string">&#x27;.&#x27;</span> + i + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> msg</span><br></pre></td></tr></table></figure><h1 id="随机语录"><a href="#随机语录" class="headerlink" title="随机语录"></a>随机语录</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/7/17 1:17</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : saying.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11 <span class="keyword">import</span> Message</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;随机语录&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.0&#x27;</span></span><br><span class="line">__usage__ = <span class="string">&#x27;命令1/saying/骚话 &lt;参数：无&gt;甜蜜的\n命令2/say/舔话 &lt;参数：无&gt;舔狗的&#x27;</span></span><br><span class="line"></span><br><span class="line">saying = on_command(<span class="string">&quot;saying&quot;</span>, aliases=&#123;<span class="string">&quot;骚话&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"><span class="meta">@saying.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>():</span><br><span class="line">    url = <span class="string">&#x27;http://api.yanxi520.cn/api/xljtwr.php?charset=utf-8http://api.yanxi520.cn/api/xljtwr.php?encode=txt&#x27;</span></span><br><span class="line">    text = requests.get(url=url).text</span><br><span class="line">    <span class="keyword">await</span> saying.send(Message(text))</span><br><span class="line"></span><br><span class="line">say = on_command(<span class="string">&quot;say&quot;</span>, aliases=&#123;<span class="string">&quot;舔话&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"><span class="meta">@say.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>():</span><br><span class="line">    url = <span class="string">&#x27;http://api.yanxi520.cn/api/tiangou.php&#x27;</span></span><br><span class="line">    text = requests.get(url=url).text</span><br><span class="line">    <span class="keyword">await</span> saying.send(Message(text))</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="淘宝优惠查询插件"><a href="#淘宝优惠查询插件" class="headerlink" title="淘宝优惠查询插件"></a>淘宝优惠查询插件</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/7/13 22:37</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : tao.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> uuid</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_message</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11 <span class="keyword">import</span> Bot, GroupMessageEvent, MessageEvent</span><br><span class="line"><span class="keyword">from</span> .config <span class="keyword">import</span> global_config</span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;淘宝商品优惠查询&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.0&#x27;</span></span><br><span class="line">__usage__ = <span class="string">&#x27;操作方式-打开淘宝-分享商品-复制链接到群内&#x27;</span></span><br><span class="line"></span><br><span class="line">app_key = global_config.app_key</span><br><span class="line"></span><br><span class="line">find_pic = on_message(priority=<span class="number">2</span>, block=<span class="literal">False</span>)</span><br><span class="line"><span class="meta">@find_pic.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">check_pic</span>(<span class="params">bot: Bot, event: GroupMessageEvent</span>):</span><br><span class="line">    <span class="comment"># uid = [event.get_user_id()]</span></span><br><span class="line">    gid = event.group_id</span><br><span class="line">    <span class="comment"># eid = event.message_id</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">isinstance</span>(event, MessageEvent):</span><br><span class="line">        <span class="keyword">for</span> msg <span class="keyword">in</span> event.message:</span><br><span class="line">            <span class="keyword">if</span> msg.<span class="built_in">type</span> == <span class="string">&quot;text&quot;</span>:</span><br><span class="line">                text: <span class="built_in">str</span> = msg.data[<span class="string">&quot;text&quot;</span>]</span><br><span class="line">                <span class="keyword">if</span> <span class="string">&#x27;淘宝&#x27;</span> <span class="keyword">in</span> text <span class="keyword">and</span> <span class="built_in">len</span>(text) &gt;= <span class="number">44</span>:</span><br><span class="line">                    tid = get_tid(text)</span><br><span class="line">                    <span class="keyword">await</span> bot.send_group_msg(group_id=gid, message=get_taoinfo(tid))</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_taoinfo</span>(<span class="params">tid</span>):</span><br><span class="line">    url = <span class="string">&#x27;https://openapi.dataoke.com/api/goods/get-goods-details?appKey=&#x27;</span> + app_key + <span class="string">&#x27;&amp;version=v1.2.3&amp;goodsId=&#x27;</span> + tid</span><br><span class="line">    header = &#123;</span><br><span class="line">        <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36&quot;</span>&#125;</span><br><span class="line">    ret = requests.get(url, headers=header).json()</span><br><span class="line">    <span class="keyword">if</span> ret[<span class="string">&#x27;msg&#x27;</span>] == <span class="string">&#x27;淘宝id错误或无佣金&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;该商品无优惠&#x27;</span></span><br><span class="line">    desc = ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;title&#x27;</span>]</span><br><span class="line">    link = ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;itemLink&#x27;</span>]</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> desc <span class="keyword">and</span> link:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;获取优惠信息失败&#x27;</span></span><br><span class="line">    uid = <span class="string">&quot;&quot;</span>.join(<span class="built_in">str</span>(uuid.uuid4()).split(<span class="string">&quot;-&quot;</span>)) + <span class="string">&#x27;.&#x27;</span> + <span class="built_in">str</span>(time.time() * <span class="number">1000</span>)</span><br><span class="line">    data = &#123;</span><br><span class="line">        <span class="string">&#x27;eid&#x27;</span>: <span class="number">150</span>,</span><br><span class="line">        <span class="string">&#x27;p&#x27;</span>: <span class="number">1</span>,</span><br><span class="line">        <span class="string">&#x27;b&#x27;</span>: <span class="number">8</span>,</span><br><span class="line">        <span class="string">&#x27;aid&#x27;</span>: <span class="number">191</span>,</span><br><span class="line">        <span class="string">&#x27;uuid&#x27;</span>: uid,</span><br><span class="line">        <span class="string">&#x27;title&#x27;</span>: desc,</span><br><span class="line">        <span class="string">&#x27;v&#x27;</span>: <span class="string">&#x27;2.1.0&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;url&#x27;</span>: link</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    url = <span class="string">&#x27;https://pxapi.bntyh.com/v1/c&#x27;</span></span><br><span class="line">    ret = requests.post(url, data=json.dumps(data), headers=header).json()</span><br><span class="line"></span><br><span class="line">    msg = ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;dtitle&#x27;</span>] + <span class="string">&#x27;\n&#x27;</span> + <span class="string">&#x27;优惠金额：&#x27;</span> + ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;couponPrice&#x27;</span>] + <span class="string">&#x27;，优惠后：&#x27;</span> + ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;actual&#x27;</span> \</span><br><span class="line">          <span class="string">&#x27;Price&#x27;</span>] + <span class="string">&#x27;，返利：&#x27;</span> + ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;Rebate&#x27;</span>] + <span class="string">&#x27;，合计优惠：&#x27;</span> + ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;Discount&#x27;</span>] + <span class="string">&#x27;\n&#x27;</span> + <span class="string">&#x27;领券地址：&#x27;</span> + ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;couponLink&#x27;</span>]</span><br><span class="line">    <span class="keyword">return</span> msg</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_tid</span>(<span class="params">content</span>):</span><br><span class="line">    url = re.search(<span class="string">r&#x27;(https?)://[-A-Za-z\d+&amp;@#/%?=~_|!:,.;]+[-A-Za-z\d+&amp;@#/%=~_|]&#x27;</span>, content).group()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> url:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;输入的内容不含商品链接，请重新输入&#x27;</span></span><br><span class="line">    header = &#123;</span><br><span class="line">        <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36&quot;</span>&#125;</span><br><span class="line">    ret = requests.get(url, headers=header).text</span><br><span class="line">    url = re.search(<span class="string">r&#x27;(https?)://[-A-Za-z\d+&amp;@#/%?=~_|!:,.;]+[-A-Za-z\d+&amp;@#/%=~_|]&#x27;</span>, ret).group()</span><br><span class="line">    tid = re.search(<span class="string">r&#x27;id=(.*?)&amp;&#x27;</span>, url).group(<span class="number">1</span>)</span><br><span class="line">    <span class="keyword">return</span> tid</span><br></pre></td></tr></table></figure><h1 id="每日微语早报插件"><a href="#每日微语早报插件" class="headerlink" title="每日微语早报插件"></a>每日微语早报插件</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/7/13 1:28</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : monpost.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime</span><br><span class="line"><span class="keyword">from</span> lxml <span class="keyword">import</span> etree</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> get_bots, require</span><br><span class="line"><span class="keyword">from</span> .config <span class="keyword">import</span> plugin_config</span><br><span class="line"><span class="keyword">from</span> .switch <span class="keyword">import</span> load, upload</span><br><span class="line"></span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;每日微语早报&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.6&#x27;</span></span><br><span class="line">__usage__ = <span class="string">&#x27;每天6点50分自动运行，如果未更新早报将在30分钟后再次获取直到获取成功&#x27;</span></span><br><span class="line"></span><br><span class="line">_path = plugin_config.admin_path</span><br><span class="line">mon_path = plugin_config.mon_path</span><br><span class="line"></span><br><span class="line">header = &#123;</span><br><span class="line">    <span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) &#x27;</span></span><br><span class="line">                  <span class="string">&#x27;Chrome/75.0.3770.142 Safari/537.36&#x27;</span>&#125;</span><br><span class="line"></span><br><span class="line">scheduler = require(<span class="string">&quot;nonebot_plugin_apscheduler&quot;</span>).scheduler</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">set_job</span>():</span><br><span class="line">    (bot,) = get_bots().values()</span><br><span class="line">    funcs_status = <span class="keyword">await</span> load(_path)</span><br><span class="line">    <span class="keyword">if</span> funcs_status:</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> funcs_status:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                lf = funcs_status[i][<span class="string">&#x27;每日微语&#x27;</span>]</span><br><span class="line">            <span class="keyword">except</span> Exception:</span><br><span class="line">                lf = <span class="literal">False</span></span><br><span class="line">            <span class="keyword">if</span> lf:</span><br><span class="line">                txt = <span class="keyword">await</span> mon_post()</span><br><span class="line">                <span class="keyword">try</span>:</span><br><span class="line">                    <span class="keyword">await</span> bot.send_group_msg(group_id=<span class="built_in">int</span>(i), message=txt)</span><br><span class="line">                <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">                    <span class="built_in">print</span>(e, i + <span class="string">&#x27;这个群被禁言了跳过下一个&#x27;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">up_job</span>():</span><br><span class="line">    is_send = <span class="keyword">await</span> load(mon_path)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> is_send[<span class="string">&#x27;is_send&#x27;</span>]:</span><br><span class="line">        (bot,) = get_bots().values()</span><br><span class="line">        funcs_status = <span class="keyword">await</span> load(_path)</span><br><span class="line">        <span class="keyword">if</span> funcs_status:</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> funcs_status:</span><br><span class="line">                <span class="keyword">try</span>:</span><br><span class="line">                    lf = funcs_status[i][<span class="string">&#x27;每日微语&#x27;</span>]</span><br><span class="line">                <span class="keyword">except</span> Exception:</span><br><span class="line">                    lf = <span class="literal">False</span></span><br><span class="line">                <span class="keyword">if</span> lf:</span><br><span class="line">                    txt = <span class="keyword">await</span> mon_post()</span><br><span class="line">                    <span class="comment"># time0 = datetime.now()</span></span><br><span class="line">                    <span class="keyword">try</span>:</span><br><span class="line">                        <span class="keyword">if</span> <span class="string">&#x27;当前还没有早报&#x27;</span> <span class="keyword">in</span> txt:</span><br><span class="line">                            <span class="keyword">pass</span></span><br><span class="line">                        <span class="keyword">else</span>:</span><br><span class="line">                            <span class="keyword">await</span> bot.send_group_msg(group_id=<span class="built_in">int</span>(i), message=txt)</span><br><span class="line">                    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">                        <span class="built_in">print</span>(e, i + <span class="string">&#x27;这个群被禁言了跳过下一个&#x27;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">scheduler.add_job(set_job, <span class="string">&quot;cron&quot;</span>, hour=<span class="number">6</span>, minute=<span class="number">50</span>, <span class="built_in">id</span>=<span class="string">&quot;set_job&quot;</span>)</span><br><span class="line">scheduler.add_job(up_job, <span class="string">&quot;interval&quot;</span>, minutes=<span class="number">30</span>, <span class="built_in">id</span>=<span class="string">&quot;up_job&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">mon_post</span>():</span><br><span class="line">    time0 = datetime.now()</span><br><span class="line">    uptime = time0.strftime(<span class="string">&quot;%Y-%m-%d&quot;</span>)</span><br><span class="line">    url = <span class="string">&#x27;http://c.m.163.com/nc/subscribe/head/T1603594732083.html&#x27;</span></span><br><span class="line">    ret = requests.get(url, headers=header).json()</span><br><span class="line">    time1 = ret[<span class="string">&#x27;tab_list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;tab_data&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;ptime&#x27;</span>]</span><br><span class="line">    time2 = datetime.strptime(time1, <span class="string">&quot;%Y-%m-%d %H:%M:%S&quot;</span>).strftime(<span class="string">&quot;%Y-%m-%d&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> uptime != time2:</span><br><span class="line">        <span class="comment"># scheduler.resume_job(job_id=&#x27;up_job&#x27;)</span></span><br><span class="line">        is_send = <span class="keyword">await</span> load(mon_path)</span><br><span class="line">        is_send[<span class="string">&#x27;is_send&#x27;</span>] = <span class="literal">False</span></span><br><span class="line">        <span class="keyword">await</span> upload(mon_path, is_send)</span><br><span class="line">        res = <span class="string">&#x27;截止%s，当前还没有早报，将循环获取直到成功后返回结果。\n早报来源：https://www.163.com/dy/media/T1603594732083.html&#x27;</span> % \</span><br><span class="line">              <span class="built_in">str</span>(time0).split(<span class="string">&#x27;.&#x27;</span>)[<span class="number">0</span>]</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="comment"># scheduler.pause_job(job_id=&#x27;up_job&#x27;)</span></span><br><span class="line">        is_send = <span class="keyword">await</span> load(mon_path)</span><br><span class="line">        is_send[<span class="string">&#x27;is_send&#x27;</span>] = <span class="literal">True</span></span><br><span class="line">        <span class="keyword">await</span> upload(mon_path, is_send)</span><br><span class="line">        url = ret[<span class="string">&#x27;tab_list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;tab_data&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;url&#x27;</span>]</span><br><span class="line">        ret = requests.get(url, headers=header).text</span><br><span class="line">        soup = etree.HTML(ret)</span><br><span class="line">        _post = soup.xpath(<span class="string">&#x27;//*[@id]/text()&#x27;</span>)</span><br><span class="line">        _post1 = re.sub(<span class="string">r&#x27;\s&#x27;</span>, <span class="string">&#x27;&#x27;</span>, <span class="built_in">str</span>(_post))</span><br><span class="line">        _post1 = re.sub(<span class="string">r&quot;&#x27;\\n&#x27;,&quot;</span>, <span class="string">&quot;&quot;</span>, _post1)</span><br><span class="line">        _post1 = re.sub(<span class="string">r&quot;\\u200b&quot;</span>, <span class="string">&quot;&quot;</span>, _post1)</span><br><span class="line">        _post = _post1.split(<span class="string">&#x27;,&#x27;</span>)</span><br><span class="line">        n = <span class="number">0</span></span><br><span class="line">        res = <span class="string">&#x27;&#x27;</span></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> _post:</span><br><span class="line">            n += <span class="number">1</span></span><br><span class="line">            <span class="keyword">if</span> n &gt; <span class="number">3</span> <span class="keyword">and</span> i.find(<span class="string">&#x27;365资讯简报&#x27;</span>) == -<span class="number">1</span> <span class="keyword">and</span> i != <span class="string">&#x27; &#x27;</span>:</span><br><span class="line">                res += i + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">            <span class="keyword">if</span> n &gt; <span class="number">21</span>:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">        res = re.sub(<span class="string">r&quot;&#x27;&quot;</span>, <span class="string">&#x27;&#x27;</span>, res)</span><br><span class="line">    <span class="keyword">return</span> res</span><br></pre></td></tr></table></figure><h1 id="必应、百度、谷歌收录查询插件"><a href="#必应、百度、谷歌收录查询插件" class="headerlink" title="必应、百度、谷歌收录查询插件"></a>必应、百度、谷歌收录查询插件</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/7/21 0:34</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : record.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> lxml <span class="keyword">import</span> etree</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">from</span> urllib <span class="keyword">import</span> parse</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">from</span> nonebot.matcher <span class="keyword">import</span> Matcher</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> Arg, CommandArg, ArgPlainText</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters <span class="keyword">import</span> Message</span><br><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.common.by <span class="keyword">import</span> By</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver <span class="keyword">import</span> ChromeOptions</span><br><span class="line"><span class="keyword">from</span> playwright.async_api <span class="keyword">import</span> async_playwright</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;网址收录查询&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.4&#x27;</span></span><br><span class="line">__usage__ = <span class="string">&#x27;命令/record/收录查询&lt;参数：url,机构名 =&gt; 百度，必应，google，all（全部）&gt;\n示例/record https://app966.cn,all&#x27;</span></span><br><span class="line"></span><br><span class="line">record = on_command(<span class="string">&quot;record&quot;</span>, aliases=&#123;<span class="string">&quot;收录查询&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@record.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_first_receive</span>(<span class="params">matcher: Matcher, args: Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    arr = args.extract_plain_text().strip()</span><br><span class="line">    <span class="keyword">if</span> arr:</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;org&quot;</span>, args)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@record.got(<span class="params"><span class="string">&quot;org&quot;</span>, prompt=<span class="string">&quot;请输入待查询的域名和机构名&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_city</span>(<span class="params">org: Message = Arg(<span class="params"></span>), arr: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;org&quot;</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> arr:</span><br><span class="line">        <span class="keyword">await</span> record.reject(org.template(<span class="string">&quot;请输入域名以及查询机构，机构有：百度，必应，谷歌，all&quot;</span>))</span><br><span class="line">    err = <span class="string">&#x27;输入的内容有误，请输入&quot;/help 网址收录查询&quot;获取帮助信息&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="string">&quot;,&quot;</span> <span class="keyword">in</span> arr:</span><br><span class="line">        txt = arr.split(<span class="string">&#x27;,&#x27;</span>)</span><br><span class="line">    <span class="keyword">elif</span> <span class="string">&quot;，&quot;</span> <span class="keyword">in</span> arr:</span><br><span class="line">        txt = arr.split(<span class="string">&#x27;，&#x27;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        txt = []</span><br><span class="line">        <span class="keyword">await</span> record.finish(err)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(txt) &lt;= <span class="number">1</span>:</span><br><span class="line">        <span class="keyword">await</span> record.finish(err)</span><br><span class="line">    jg = txt[<span class="number">1</span>]</span><br><span class="line">    val = txt[<span class="number">0</span>]</span><br><span class="line">    <span class="keyword">if</span> <span class="string">&#x27;http&#x27;</span> <span class="keyword">in</span> val:</span><br><span class="line">        val = parse.urlparse(val).netloc</span><br><span class="line">    <span class="keyword">if</span> jg == <span class="string">&#x27;百度&#x27;</span> <span class="keyword">or</span> jg == <span class="string">&#x27;baidu&#x27;</span>:</span><br><span class="line">        ret = <span class="string">&#x27;[&#x27;</span> + val + <span class="string">&#x27;]百度收录结果如下：\n&#x27;</span> + <span class="keyword">await</span> baidu(val)</span><br><span class="line">    <span class="keyword">elif</span> jg == <span class="string">&#x27;必应&#x27;</span> <span class="keyword">or</span> jg == <span class="string">&#x27;bing&#x27;</span>:</span><br><span class="line">        <span class="keyword">async</span> <span class="keyword">with</span> async_playwright() <span class="keyword">as</span> playwright:</span><br><span class="line">            str_bing = <span class="keyword">await</span> bing(playwright, val)</span><br><span class="line">        ret = <span class="string">&#x27;[&#x27;</span> + val + <span class="string">&#x27;]必应收录结果如下：\n&#x27;</span> + str_bing</span><br><span class="line">    <span class="keyword">elif</span> jg == <span class="string">&#x27;google&#x27;</span> <span class="keyword">or</span> jg == <span class="string">&#x27;谷歌&#x27;</span>:</span><br><span class="line">        ret = <span class="string">&#x27;[&#x27;</span> + val + <span class="string">&#x27;]谷歌收录结果如下：\n免费机器人不支持谷歌查询&#x27;</span></span><br><span class="line">    <span class="keyword">elif</span> jg == <span class="string">&#x27;all&#x27;</span>:</span><br><span class="line">        <span class="keyword">async</span> <span class="keyword">with</span> async_playwright() <span class="keyword">as</span> playwright:</span><br><span class="line">            str_bing = <span class="keyword">await</span> bing(playwright, val)</span><br><span class="line">        ret = <span class="string">&#x27;[&#x27;</span> + val + <span class="string">&#x27;]的收录结果如下：\n百度：&#x27;</span> + <span class="keyword">await</span> baidu(val) + <span class="string">&#x27;\n必应：&#x27;</span> + str_bing</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        ret = err</span><br><span class="line">    <span class="keyword">await</span> record.finish(ret)</span><br><span class="line"></span><br><span class="line">uadata = [</span><br><span class="line">    <span class="string">&#x27;Mozilla/5.0 (Linux; Android 10; SKW-A0 Build/SKYW2001202CN00MQ0; wv) AppleWebKit/537.36 (KHTML, like Gecko) &#x27;</span></span><br><span class="line">    <span class="string">&#x27;Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36 T7/11.20 SP-engine/2.16.0 baiduboxapp/11.20.0.14 (Baidu; P1 &#x27;</span></span><br><span class="line">    <span class="string">&#x27;10)&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;Mozilla/5.0 (Linux; Android 8.1.0; Redmi Note 5 Build/OPM1.171019.011; wv) AppleWebKit/537.36 (KHTML, &#x27;</span></span><br><span class="line">    <span class="string">&#x27;like Gecko) Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36 T7/11.20 SP-engine/2.16.0 &#x27;</span></span><br><span class="line">    <span class="string">&#x27;baiduboxapp/11.20.0.14 (Baidu; P1 8.1.0) NABar/2.0&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;Mozilla/5.0 (iPhone; CPU iPhone OS 13_0 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/13.0 &#x27;</span></span><br><span class="line">    <span class="string">&#x27;MQQBrowser/10.1.1 Mobile/15B87 Safari/604.1 QBWebViewUA/2 QBWebViewType/1 WKType/1&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;Mozilla/5.0 (Linux; Android 10; MI 9 Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) &#x27;</span></span><br><span class="line">    <span class="string">&#x27;Version/4.0 Chrome/67.0.3396.87 XWEB/1171 MMWEBSDK/200201 Mobile Safari/537.36 MMWEBID/2568 &#x27;</span></span><br><span class="line">    <span class="string">&#x27;MicroMessenger/7.0.12.1620(0x27000C37) Process/tools NetType/4G Language/zh_CN ABI/arm64&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;Mozilla/5.0 (Linux; Android 9; ONEPLUS A6000 Build/PKQ1.180716.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) &#x27;</span></span><br><span class="line">    <span class="string">&#x27;Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36 T7/11.20 SP-engine/2.16.0 baiduboxapp/11.20.0.14 (Baidu; P1 &#x27;</span></span><br><span class="line">    <span class="string">&#x27;9) NABar/2.0&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; HUAWEI NXT-AL10 Build/HUAWEINXT-AL10) AppleWebKit/537.36 (KHTML, &#x27;</span></span><br><span class="line">    <span class="string">&#x27;like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/9.0 Mobile Safari/537.36 &#x27;</span></span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">baidu</span>(<span class="params">link</span>):</span><br><span class="line">    <span class="comment"># link2 = link.split(&#x27;.&#x27;)</span></span><br><span class="line">    <span class="comment"># max = len(link2)</span></span><br><span class="line">    <span class="comment"># link3 = link if max &lt; 3 else link2[max - 2] + &quot;.&quot; + link2[max - 1]</span></span><br><span class="line">    url = <span class="string">&#x27;https://www.baidu.com/s?ie=utf-8&amp;tn=baidu&amp;wd=site%3A&#x27;</span> + link</span><br><span class="line">    header = &#123;<span class="string">&#x27;User-Agent&#x27;</span>: random.choice(uadata)&#125;</span><br><span class="line">    ret = requests.get(url, headers=header).text</span><br><span class="line">    soup = etree.HTML(ret)</span><br><span class="line">    res = soup.xpath(<span class="string">&#x27;//*[@id=&quot;content_left&quot;]//div/p/b/text()&#x27;</span>)</span><br><span class="line">    msg = res[<span class="number">0</span>] <span class="keyword">if</span> <span class="built_in">len</span>(res) &gt; <span class="number">0</span> <span class="keyword">else</span> <span class="string">&#x27;未收录&#x27;</span></span><br><span class="line">    <span class="comment"># print(msg)</span></span><br><span class="line">    <span class="keyword">return</span> msg</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">bing</span>(<span class="params">p, link</span>):</span><br><span class="line">    browser = <span class="keyword">await</span> p.chromium.launch(headless=<span class="literal">False</span>)</span><br><span class="line">    context = <span class="keyword">await</span> browser.new_context()</span><br><span class="line">    page = <span class="keyword">await</span> context.new_page()</span><br><span class="line">    url = <span class="string">&#x27;https://cn.bing.com/search?q=site%3A&#x27;</span> + link</span><br><span class="line">    <span class="keyword">await</span> page.goto(url)</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        res = <span class="keyword">await</span> page.locator(<span class="string">&#x27;xpath=//*[@id=&quot;b_tween&quot;]/span[1]&#x27;</span>).text_content(timeout=<span class="number">2000</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception:</span><br><span class="line">        res = <span class="string">&#x27;未收录&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> res:</span><br><span class="line">        res = <span class="string">&#x27;未收录&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> res</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">google</span>(<span class="params">link</span>):</span><br><span class="line">    url = <span class="string">&#x27;https://www.google.com/search?q=site%3A&#x27;</span> + link</span><br><span class="line">    options = ChromeOptions()</span><br><span class="line">    <span class="comment"># options.add_argument(&quot;--headless&quot;)</span></span><br><span class="line">    options.add_argument(<span class="string">&#x27;--incognito&#x27;</span>)</span><br><span class="line">    options.add_argument(<span class="string">&#x27;--blink-settings=imagesEnabled=false&#x27;</span>)</span><br><span class="line">    browser = webdriver.Chrome(executable_path=<span class="string">r&#x27;C:\Program Files\Google\Chrome\Application\chromedriver.exe&#x27;</span>, options=options)</span><br><span class="line">    browser.get(url)</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        res = browser.find_element(By.XPATH, <span class="string">&#x27;//*[@id=&quot;result-stats&quot;]&#x27;</span>).text</span><br><span class="line">    <span class="keyword">except</span> Exception:</span><br><span class="line">        res = <span class="string">&#x27;未收录&#x27;</span></span><br><span class="line">    browser.close()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> res:</span><br><span class="line">        res = <span class="string">&#x27;未收录&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> res</span><br></pre></td></tr></table></figure><h1 id="自助服务"><a href="#自助服务" class="headerlink" title="自助服务"></a>自助服务</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/9/8 7:11</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : service.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line"><span class="keyword">import</span> pymysql</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11 <span class="keyword">import</span> GroupMessageEvent</span><br><span class="line"><span class="keyword">from</span> nonebot.matcher <span class="keyword">import</span> Matcher</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> Arg, CommandArg, ArgPlainText</span><br><span class="line"><span class="keyword">from</span> .config <span class="keyword">import</span> plugin_config</span><br><span class="line"><span class="keyword">from</span> .switch <span class="keyword">import</span> load, upload</span><br><span class="line"></span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;自助服务&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.4&#x27;</span></span><br><span class="line">__usage__ = <span class="string">&#x27;本服务仅支持在售后群使用\n请输入序号获取对应的服务\n1.解绑换绑\n2.今日价格\n喜讯：\n解绑服务升级，支持秒解绑&#x27;</span></span><br><span class="line"></span><br><span class="line">bind_path = plugin_config.bind_path  <span class="comment"># 记录解绑换绑次数</span></span><br><span class="line">price_path = plugin_config.price_path  <span class="comment"># 记录每日随机价格 价格随机尾数不含6,8,9否则导致容易被支付风控</span></span><br><span class="line">binds_path = plugin_config.binds_path  <span class="comment"># 记录待解绑换绑的账号</span></span><br><span class="line"></span><br><span class="line">self_service = on_command(<span class="string">&quot;self-service&quot;</span>, aliases=&#123;<span class="string">&quot;自助服务&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@self_service.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">event: GroupMessageEvent, matcher: Matcher, args: nonebot.adapters.Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    gid = <span class="built_in">str</span>(event.group_id)  <span class="comment"># 群号</span></span><br><span class="line">    <span class="keyword">if</span> gid != <span class="string">&#x27;866432359&#x27;</span>:</span><br><span class="line">        <span class="keyword">await</span> self_service.finish(<span class="string">f&#x27;此服务不支持在群[<span class="subst">&#123;gid&#125;</span>]使用，请前往售后群&#x27;</span>)</span><br><span class="line">    list_name = args.extract_plain_text().strip()</span><br><span class="line">    <span class="keyword">if</span> list_name:</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;self&quot;</span>, args)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@self_service.got(<span class="params"><span class="string">&quot;self&quot;</span>, prompt=<span class="string">&quot;请输入序号获取对应的服务\n1.解绑换绑\n2.今日价格&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">self: nonebot.adapters.Message = Arg(<span class="params"></span>), text: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;self&quot;</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> text:</span><br><span class="line">        <span class="keyword">await</span> self_service.reject(self.template(<span class="string">&quot;序号不能为空&quot;</span>))</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">int</span>(text) == <span class="number">1</span>:</span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    <span class="keyword">elif</span> <span class="built_in">int</span>(text) == <span class="number">2</span>:</span><br><span class="line">        funcs_status = <span class="keyword">await</span> load(price_path)</span><br><span class="line">        now = datetime.datetime.now()</span><br><span class="line">        _date = <span class="built_in">str</span>(now.year) + <span class="built_in">str</span>(now.month).zfill(<span class="number">2</span>) + <span class="built_in">str</span>(now.day).zfill(<span class="number">2</span>)</span><br><span class="line">        <span class="keyword">if</span> funcs_status.get(_date, <span class="literal">None</span>):</span><br><span class="line">            <span class="keyword">await</span> self_service.finish(<span class="string">&quot;今日价格：&quot;</span> + <span class="built_in">str</span>(funcs_status[_date]))</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">                price = random.randint(<span class="number">1100</span>, <span class="number">1400</span>)</span><br><span class="line">                <span class="keyword">if</span> <span class="built_in">str</span>(price)[-<span class="number">1</span>] != <span class="string">&#x27;6&#x27;</span> <span class="keyword">and</span> <span class="built_in">str</span>(price)[-<span class="number">1</span>] != <span class="string">&#x27;8&#x27;</span> <span class="keyword">and</span> <span class="built_in">str</span>(price)[-<span class="number">1</span>] != <span class="string">&#x27;9&#x27;</span> <span class="keyword">and</span> <span class="built_in">str</span>(price)[-<span class="number">1</span>] != <span class="string">&#x27;0&#x27;</span>:</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line">            funcs_status[_date] = price</span><br><span class="line">            trend = <span class="string">&#x27;低&#x27;</span> <span class="keyword">if</span> price &lt; <span class="number">1200</span> <span class="keyword">else</span> <span class="string">&#x27;均衡&#x27;</span> <span class="keyword">if</span> price &lt; <span class="number">1300</span> <span class="keyword">else</span> <span class="string">&#x27;较高&#x27;</span></span><br><span class="line">            <span class="keyword">await</span> upload(price_path, funcs_status)</span><br><span class="line">            <span class="keyword">await</span> self_service.finish(<span class="string">&quot;今日价格：&quot;</span> + <span class="built_in">str</span>(price) + <span class="string">&#x27;，价格趋势：&#x27;</span> + trend)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@self_service.got(<span class="params"><span class="string">&quot;id&quot;</span>, prompt=<span class="string">&quot;请输入待解绑的账号&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">self: nonebot.adapters.Message = Arg(<span class="params"></span>), ids: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;id&quot;</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> ids <span class="keyword">or</span> <span class="built_in">len</span>(ids) &lt; <span class="number">6</span>:</span><br><span class="line">        <span class="keyword">await</span> self_service.reject(self.template(<span class="string">&quot;请正确输入账号&quot;</span>))</span><br><span class="line"></span><br><span class="line">    funcs_status = <span class="keyword">await</span> load(bind_path)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># async with aiofiles.open(binds_path, &#x27;r+&#x27;, encoding=&#x27;utf-8&#x27;) as f:</span></span><br><span class="line">    <span class="comment">#     custom_limit_words = await f.read()</span></span><br><span class="line">    <span class="comment">#     rules = custom_limit_words.split(&#x27;\n&#x27;)</span></span><br><span class="line">    <span class="comment">#     if ids not in rules:</span></span><br><span class="line">    <span class="comment">#         if custom_limit_words == &#x27;&#x27;:</span></span><br><span class="line">    <span class="comment">#             await f.write(ids)</span></span><br><span class="line">    <span class="comment">#         else:</span></span><br><span class="line">    <span class="comment">#             await f.write(custom_limit_words + &#x27;\n&#x27; + ids)</span></span><br><span class="line">    <span class="comment">#         await f.close()</span></span><br><span class="line">    <span class="comment">#     else:</span></span><br><span class="line">    <span class="comment">#         await self_service.finish(&quot;您的账号待解绑中，请勿重复提交&quot;)</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        num = funcs_status[ids]</span><br><span class="line">    <span class="keyword">except</span> KeyError:</span><br><span class="line">        num = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> funcs_status.get(ids, <span class="literal">None</span>):</span><br><span class="line">        <span class="keyword">if</span> <span class="number">1</span> &lt;= num &lt;= <span class="number">5</span>:</span><br><span class="line">            x = <span class="number">3</span></span><br><span class="line">            res = <span class="string">&#x27;已扣除3天使用时间&#x27;</span></span><br><span class="line">        <span class="keyword">elif</span> <span class="number">6</span> &lt;= num &lt;= <span class="number">10</span>:</span><br><span class="line">            x = <span class="number">7</span></span><br><span class="line">            res = <span class="string">&#x27;已扣除7天使用时间&#x27;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            x = <span class="number">15</span></span><br><span class="line">            res = <span class="string">&#x27;已扣除15天使用时间&#x27;</span></span><br><span class="line">        ret = sql_jiebang(ids, x)</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&#x27;成功&#x27;</span> <span class="keyword">in</span> ret:</span><br><span class="line">            num += <span class="number">1</span></span><br><span class="line">            funcs_status[ids] = num</span><br><span class="line">            <span class="keyword">await</span> upload(bind_path, funcs_status)</span><br><span class="line">        <span class="keyword">await</span> self_service.finish(<span class="string">f&quot;您是第<span class="subst">&#123;num&#125;</span>次解绑，解绑条件：<span class="subst">&#123;res&#125;</span>，解绑状态：&quot;</span> + ret)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        ret = sql_jiebang(ids, <span class="number">0</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&#x27;成功&#x27;</span> <span class="keyword">in</span> ret:</span><br><span class="line">            funcs_status[ids] = <span class="number">1</span></span><br><span class="line">            <span class="keyword">await</span> upload(bind_path, funcs_status)</span><br><span class="line">        <span class="keyword">await</span> self_service.finish(<span class="string">&quot;您是首次解绑，解绑条件：无，解绑状态：&quot;</span> + ret)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_conn2</span>():</span><br><span class="line">    <span class="keyword">return</span> pymysql.connect(</span><br><span class="line">        host=<span class="string">&#x27;xxx&#x27;</span>,</span><br><span class="line">        user=<span class="string">&#x27;xxx&#x27;</span>,</span><br><span class="line">        password=<span class="string">&#x27;xxx&#x27;</span>,</span><br><span class="line">        database=<span class="string">&#x27;xxx&#x27;</span>,</span><br><span class="line">        charset=<span class="string">&#x27;utf8&#x27;</span>,</span><br><span class="line">        port=<span class="number">3306</span></span><br><span class="line">    )</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sql_jiebang</span>(<span class="params">uid, l</span>):</span><br><span class="line">    conn = get_conn2()</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        cursor = conn.cursor(pymysql.cursors.DictCursor)</span><br><span class="line">        cursor.execute(<span class="string">&quot;SELECT L_key_info,L_vip_unix FROM bsphp_pattern_login WHERE L_ic_name=%s and L_key_info !=&#x27;&#x27;&quot;</span>,</span><br><span class="line">                       uid)</span><br><span class="line">        data = cursor.fetchall()</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(data) &gt; <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> data:</span><br><span class="line">                <span class="keyword">if</span> <span class="built_in">int</span>(time.time()) &lt; i[<span class="string">&#x27;L_vip_unix&#x27;</span>]:</span><br><span class="line">                    times = i[<span class="string">&#x27;L_vip_unix&#x27;</span>] - <span class="number">86400</span> * l</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    times = i[<span class="string">&#x27;L_vip_unix&#x27;</span>]</span><br><span class="line">                cursor.execute(</span><br><span class="line">                    <span class="string">&quot;UPDATE bsphp_pattern_login SET L_key_info=&#x27;&#x27;,L_vip_unix=%s WHERE L_key_info = %s&quot;</span>,</span><br><span class="line">                    (times, i[<span class="string">&#x27;L_key_info&#x27;</span>]))</span><br><span class="line">                conn.commit()</span><br><span class="line">            res = <span class="string">&#x27;解绑成功&#x27;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            res = <span class="string">&#x27;解绑失败，可能已经解绑或没有该账号&#x27;</span></span><br><span class="line">    <span class="keyword">finally</span>:</span><br><span class="line">        conn.close()</span><br><span class="line">    <span class="keyword">return</span> res</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> get_driver</span><br><span class="line"><span class="keyword">from</span> pydantic <span class="keyword">import</span> BaseModel, Extra</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Config</span>(BaseModel, extra=Extra.ignore):</span><br><span class="line">    ban_rand_time_min: <span class="built_in">int</span> = <span class="number">60</span>  <span class="comment"># 随机禁言最短时间(s) default: 1分钟</span></span><br><span class="line">    ban_rand_time_max: <span class="built_in">int</span> = <span class="number">86400</span>  <span class="comment"># 随机禁言最长时间(s) default: 3天: 60*60*24*3</span></span><br><span class="line">    config_group_admin: <span class="built_in">bool</span> = <span class="literal">True</span>  <span class="comment"># 是否自动同意入群请求</span></span><br><span class="line">    answer: <span class="built_in">list</span> = [<span class="string">&#x27;app966.cn&#x27;</span>, <span class="string">&#x27;916790180&#x27;</span>]  <span class="comment"># 需要正确回答问题才能入群</span></span><br><span class="line">    answer_int: <span class="built_in">int</span> = <span class="number">8</span>  <span class="comment"># 问题的答案长度不小于x才能入群 两者为或者关系 满足其一即可让他入群</span></span><br><span class="line">    bot_id: <span class="built_in">int</span> = <span class="number">690518713</span>  <span class="comment"># 机器人qq号</span></span><br><span class="line">    <span class="comment"># 如果要唯一关系把答案长度改为较大的数或把答案设为复杂类型</span></span><br><span class="line">    _path = os.path.abspath(<span class="string">&#x27;.&#x27;</span>)</span><br><span class="line">    admin_path: <span class="built_in">str</span> = _path + <span class="string">&quot;\\admin.json&quot;</span>  <span class="comment"># 默认&#123;&#125;</span></span><br><span class="line">    douyin_path: <span class="built_in">str</span> = _path + <span class="string">&quot;\\douyin.json&quot;</span>  <span class="comment"># 默认&#123;&#125;</span></span><br><span class="line">    mon_path: <span class="built_in">str</span> = _path + <span class="string">&quot;\\mon_post.json&quot;</span>  <span class="comment"># 默认&#123;&quot;is_send&quot;: false&#125;</span></span><br><span class="line">    jin_path: <span class="built_in">str</span> = _path + <span class="string">&quot;\\f_word_s.txt&quot;</span></span><br><span class="line">    price_path: <span class="built_in">str</span> = _path + <span class="string">&quot;\\price.json&quot;</span>  <span class="comment"># 默认&#123;&#125;</span></span><br><span class="line">    bind_path: <span class="built_in">str</span> = _path + <span class="string">&quot;\\bind.json&quot;</span>  <span class="comment"># 默认&#123;&#125;</span></span><br><span class="line">    binds_path: <span class="built_in">str</span> = _path + <span class="string">&quot;\\bind.txt&quot;</span></span><br><span class="line">    keys: <span class="built_in">list</span> = [<span class="string">&#x27;防撤回&#x27;</span>, <span class="string">&#x27;进退提示&#x27;</span>, <span class="string">&#x27;每日微语&#x27;</span>, <span class="string">&#x27;违禁词检测&#x27;</span>, <span class="string">&#x27;加群处理&#x27;</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">global_config = get_driver().config</span><br><span class="line">plugin_config = Config.parse_obj(global_config)</span><br></pre></td></tr></table></figure><h1 id="开关按钮"><a href="#开关按钮" class="headerlink" title="开关按钮"></a>开关按钮</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/7/17 4:43</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : switch.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> nonebot_plugin_txt2img <span class="keyword">import</span> Txt2Img</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">from</span> nonebot.typing <span class="keyword">import</span> T_State</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11.permission <span class="keyword">import</span> GROUP_ADMIN, GROUP_OWNER</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11 <span class="keyword">import</span> GroupMessageEvent, MessageSegment</span><br><span class="line"><span class="keyword">from</span> nonebot.permission <span class="keyword">import</span> SUPERUSER</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> CommandArg</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> typing <span class="keyword">import</span> <span class="type">Union</span>, <span class="type">List</span></span><br><span class="line"><span class="keyword">import</span> aiofiles</span><br><span class="line"><span class="keyword">from</span> .config <span class="keyword">import</span> plugin_config</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;开关按钮&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.4&#x27;</span></span><br><span class="line">__usage__ = <span class="string">&#x27;命令1/开关 &lt;参数：要开关的功能&gt; 目前支持：防撤回,进退提示,每日微&#x27;</span> \</span><br><span class="line">            <span class="string">&#x27;语,违禁词检测,加群处理[需要把机器人设为管理员]\n命令2/开关状态 &lt;参数：无&gt;\n命令3/添加违禁词 &lt;参数：违禁词&gt;&#x27;</span></span><br><span class="line"></span><br><span class="line">_path = plugin_config.admin_path</span><br><span class="line">_val = plugin_config.keys</span><br><span class="line">jin_path = plugin_config.jin_path</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">load</span>(<span class="params">path</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    加载json文件</span></span><br><span class="line"><span class="string">    :return: dict</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">async</span> <span class="keyword">with</span> aiofiles.<span class="built_in">open</span>(path, mode=<span class="string">&#x27;r&#x27;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            contents_ = <span class="keyword">await</span> f.read()</span><br><span class="line">            <span class="keyword">if</span> contents_.startswith(<span class="string">u&#x27;\ufeff&#x27;</span>):</span><br><span class="line">                contents_ = contents_.encode(<span class="string">&#x27;utf8&#x27;</span>)[<span class="number">3</span>:].decode(<span class="string">&#x27;utf8&#x27;</span>)</span><br><span class="line">            contents = json.loads(contents_)</span><br><span class="line">            <span class="keyword">await</span> f.close()</span><br><span class="line">            <span class="keyword">return</span> contents</span><br><span class="line">    <span class="keyword">except</span> FileNotFoundError:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">upload</span>(<span class="params">path, dict_content</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    更新json文件</span></span><br><span class="line"><span class="string">    :param path: 路径</span></span><br><span class="line"><span class="string">    :param dict_content: python对象，字典</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">with</span> aiofiles.<span class="built_in">open</span>(path, mode=<span class="string">&#x27;w&#x27;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>) <span class="keyword">as</span> c:</span><br><span class="line">        <span class="keyword">await</span> c.write(<span class="built_in">str</span>(json.dumps(dict_content, ensure_ascii=<span class="literal">False</span>)))</span><br><span class="line">        <span class="keyword">await</span> c.close()</span><br><span class="line"></span><br><span class="line">add_sao = on_command(<span class="string">&quot;添加违禁词&quot;</span>, priority=<span class="number">1</span>, block=<span class="literal">True</span>, permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER)</span><br><span class="line"><span class="meta">@add_sao.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">event: GroupMessageEvent, args: nonebot.adapters.Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    _sao = args.extract_plain_text()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> _sao:</span><br><span class="line">        <span class="keyword">await</span> add_sao.finish(<span class="string">&quot;出错啦，你还没有添加违禁词&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(_sao) &gt; <span class="number">5</span>:</span><br><span class="line">        <span class="keyword">await</span> add_sao.finish(<span class="string">&quot;违禁词宜短不宜长，你输入的太长了&quot;</span>)</span><br><span class="line">    gid = <span class="built_in">str</span>(event.group_id)</span><br><span class="line">    funcs_status = (<span class="keyword">await</span> load(_path))</span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">with</span> aiofiles.<span class="built_in">open</span>(jin_path, <span class="string">&#x27;r+&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        custom_limit_words = <span class="keyword">await</span> f.read()</span><br><span class="line">        rules = [re.sub(<span class="string">r&#x27;\t+&#x27;</span>, <span class="string">&#x27;\t&#x27;</span>, rule).split(<span class="string">&#x27;\t&#x27;</span>) <span class="keyword">for</span> rule <span class="keyword">in</span></span><br><span class="line">                 custom_limit_words.split(<span class="string">&#x27;\n&#x27;</span>)]</span><br><span class="line">        <span class="keyword">if</span> _sao <span class="keyword">in</span> rules:</span><br><span class="line">            <span class="keyword">await</span> f.close()</span><br><span class="line">            <span class="keyword">await</span> add_sao.finish(<span class="string">&quot;这个违禁词已经添加过啦，请不要重复添加！&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">await</span> f.write(custom_limit_words + <span class="string">&#x27;\n&#x27;</span> + _sao)</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                lfc = funcs_status[gid][<span class="string">&#x27;违禁词检测&#x27;</span>]</span><br><span class="line">            <span class="keyword">except</span> Exception:</span><br><span class="line">                lfc = <span class="literal">False</span></span><br><span class="line">            we = <span class="string">&#x27;，你还没有开启违禁词检测哦！&#x27;</span></span><br><span class="line">            <span class="keyword">if</span> lfc:</span><br><span class="line">                we = <span class="string">&#x27;&#x27;</span></span><br><span class="line">            msg = <span class="string">&#x27;违禁词添加成功&#x27;</span> + we</span><br><span class="line">            <span class="keyword">await</span> f.close()</span><br><span class="line">            <span class="keyword">await</span> add_sao.finish(msg)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">switcher = on_command(<span class="string">&quot;开关&quot;</span>, priority=<span class="number">1</span>, block=<span class="literal">True</span>, permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER)</span><br><span class="line"><span class="meta">@switcher.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">event: GroupMessageEvent, state: T_State</span>):</span><br><span class="line">    gid = <span class="built_in">str</span>(event.group_id)</span><br><span class="line">    user_input_func_name = <span class="built_in">str</span>(state[<span class="string">&#x27;_prefix&#x27;</span>][<span class="string">&#x27;command_arg&#x27;</span>])</span><br><span class="line">    <span class="keyword">if</span> user_input_func_name <span class="keyword">in</span> _val:</span><br><span class="line">        funcs_status = <span class="keyword">await</span> load(_path)</span><br><span class="line">        <span class="keyword">if</span> funcs_status != <span class="literal">None</span>:</span><br><span class="line">            key = funcs_status</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> funcs_status.get(gid, <span class="literal">None</span>):</span><br><span class="line">                kk = &#123;&#125;</span><br><span class="line">                <span class="keyword">for</span> n <span class="keyword">in</span> _val:</span><br><span class="line">                    kk.update(&#123;n: <span class="literal">True</span>&#125;)</span><br><span class="line">                    key.update(&#123;gid: kk&#125;)</span><br><span class="line">                <span class="keyword">await</span> upload(_path, key)</span><br><span class="line">                <span class="keyword">await</span> switcher.finish(<span class="string">&quot;已开启&quot;</span> + user_input_func_name)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">try</span>:</span><br><span class="line">                    lf = funcs_status[gid][user_input_func_name]</span><br><span class="line">                <span class="keyword">except</span> Exception:</span><br><span class="line">                    lf = <span class="literal">False</span></span><br><span class="line">                    funcs_status.update(&#123;user_input_func_name: lf&#125;)</span><br><span class="line">                    <span class="keyword">await</span> upload(_path, funcs_status)</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> lf:</span><br><span class="line">                    funcs_status[gid][user_input_func_name] = <span class="literal">False</span></span><br><span class="line">                    <span class="keyword">await</span> upload(_path, funcs_status)</span><br><span class="line">                    <span class="keyword">await</span> switcher.finish(<span class="string">&quot;已关闭&quot;</span> + user_input_func_name)</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    funcs_status[gid][user_input_func_name] = <span class="literal">True</span></span><br><span class="line">                    <span class="keyword">await</span> upload(_path, funcs_status)</span><br><span class="line">                    <span class="keyword">await</span> switcher.finish(<span class="string">&quot;已开启&quot;</span> + user_input_func_name)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            key = &#123;&#125;</span><br><span class="line">            kk = &#123;&#125;</span><br><span class="line">            <span class="keyword">for</span> n <span class="keyword">in</span> _val:</span><br><span class="line">                kk.update(&#123;n: <span class="literal">True</span>&#125;)</span><br><span class="line">                key.update(&#123;gid: kk&#125;)</span><br><span class="line">            <span class="keyword">await</span> upload(_path, key)</span><br><span class="line">            <span class="keyword">await</span> switcher.finish(<span class="string">&quot;已开启&quot;</span> + user_input_func_name)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        pluginfo = <span class="string">&#x27;&#x27;</span></span><br><span class="line">        <span class="keyword">for</span> n <span class="keyword">in</span> _val:</span><br><span class="line">            pluginfo += n + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">        <span class="keyword">await</span> switcher.finish(<span class="string">&quot;只支持被动插件\n意指不需要主动输入命令唤醒的插件\n目前支持的被动插件有：\n&quot;</span> + pluginfo)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">switcher_html = on_command(<span class="string">&quot;开关状态&quot;</span>, priority=<span class="number">1</span>, block=<span class="literal">True</span>)</span><br><span class="line"><span class="meta">@switcher_html.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">event: GroupMessageEvent</span>):</span><br><span class="line">    gid = <span class="built_in">str</span>(event.group_id)</span><br><span class="line">    funcs_status = (<span class="keyword">await</span> load(_path))</span><br><span class="line">    data = funcs_status.get(gid, <span class="string">&#x27;&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> data:</span><br><span class="line">        <span class="keyword">await</span> switcher.finish(<span class="string">&quot;本群没有开启的被动插件&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        pluginfo = <span class="string">&#x27;&#x27;</span></span><br><span class="line">        <span class="keyword">for</span> n <span class="keyword">in</span> data:</span><br><span class="line">            state = <span class="string">&quot;已激活&quot;</span> <span class="keyword">if</span> data[n] <span class="keyword">else</span> <span class="string">&quot;已关闭&quot;</span></span><br><span class="line">            <span class="keyword">if</span> n == <span class="string">&#x27;违禁词检测&#x27;</span> <span class="keyword">or</span> n == <span class="string">&#x27;加群处理&#x27;</span>:</span><br><span class="line">                state = state + <span class="string">&#x27;[需管理权限]&#x27;</span></span><br><span class="line">            pluginfo += n + <span class="string">&#x27;：&#x27;</span> + state + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">        font_size = <span class="number">32</span></span><br><span class="line">        title = <span class="string">&#x27;被动插件开关状态&#x27;</span></span><br><span class="line">        text = pluginfo</span><br><span class="line">        img = Txt2Img(font_size)</span><br><span class="line">        pic = img.save(title, text)</span><br><span class="line">        <span class="keyword">await</span> switcher.finish(MessageSegment.image(pic))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">At</span>(<span class="params">data: <span class="built_in">str</span></span>) -&gt; <span class="type">Union</span>[<span class="type">List</span>[<span class="built_in">str</span>], <span class="type">List</span>[<span class="built_in">int</span>], <span class="built_in">list</span>]:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    检测at了谁，返回[qq, qq, qq,...]</span></span><br><span class="line"><span class="string">    包含全体成员直接返回[&#x27;all&#x27;]</span></span><br><span class="line"><span class="string">    如果没有at任何人，返回[]</span></span><br><span class="line"><span class="string">    :param data: event.json</span></span><br><span class="line"><span class="string">    :return: list</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        qq_list = []</span><br><span class="line">        data = json.loads(data)</span><br><span class="line">        <span class="keyword">for</span> msg <span class="keyword">in</span> data[<span class="string">&quot;message&quot;</span>]:</span><br><span class="line">            <span class="keyword">if</span> msg[<span class="string">&quot;type&quot;</span>] == <span class="string">&quot;at&quot;</span>:</span><br><span class="line">                <span class="keyword">if</span> <span class="string">&#x27;all&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> <span class="built_in">str</span>(msg):</span><br><span class="line">                    qq_list.append(<span class="built_in">int</span>(msg[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;qq&quot;</span>]))</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="keyword">return</span> [<span class="string">&#x27;all&#x27;</span>]</span><br><span class="line">        <span class="keyword">return</span> qq_list</span><br><span class="line">    <span class="keyword">except</span> KeyError:</span><br><span class="line">        <span class="keyword">return</span> []</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">Reply</span>(<span class="params">data: <span class="built_in">str</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    检测回复哪条消息，返回 reply 对象</span></span><br><span class="line"><span class="string">    如果没有回复任何人，返回 None</span></span><br><span class="line"><span class="string">    :param data: event.json()</span></span><br><span class="line"><span class="string">    :return: dict | None</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        data = json.loads(data)</span><br><span class="line">        <span class="keyword">if</span> data[<span class="string">&quot;reply&quot;</span>] <span class="keyword">and</span> data[<span class="string">&quot;reply&quot;</span>][<span class="string">&quot;message_id&quot;</span>]:  <span class="comment"># 待优化</span></span><br><span class="line">            <span class="keyword">return</span> data[<span class="string">&quot;reply&quot;</span>]</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line">    <span class="keyword">except</span> KeyError:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">MsgText</span>(<span class="params">data: <span class="built_in">str</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    返回消息文本段内容(即去除 cq 码后的内容)</span></span><br><span class="line"><span class="string">    :param data: event.json()</span></span><br><span class="line"><span class="string">    :return: str</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        data = json.loads(data)</span><br><span class="line">        <span class="comment"># 过滤出类型为 text 的【并且过滤内容为空的】</span></span><br><span class="line">        msg_text_list = <span class="built_in">filter</span>(<span class="keyword">lambda</span> x: x[<span class="string">&quot;type&quot;</span>] == <span class="string">&quot;text&quot;</span> <span class="keyword">and</span> x[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;text&quot;</span>].replace(<span class="string">&quot; &quot;</span>, <span class="string">&quot;&quot;</span>) != <span class="string">&quot;&quot;</span>,</span><br><span class="line">                               data[<span class="string">&quot;message&quot;</span>])</span><br><span class="line">        <span class="comment"># 拼接成字符串并且去除两端空格</span></span><br><span class="line">        msg_text = <span class="string">&quot; &quot;</span>.join(<span class="built_in">map</span>(<span class="keyword">lambda</span> x: x[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;text&quot;</span>].strip(), msg_text_list)).strip()</span><br><span class="line">        <span class="keyword">return</span> msg_text</span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br></pre></td></tr></table></figure><h1 id="chatGPT插件"><a href="#chatGPT插件" class="headerlink" title="chatGPT插件"></a>chatGPT插件</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/12/9 12:29</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : chatgpt.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command, on_message</span><br><span class="line"><span class="keyword">import</span> nonebot</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> CommandArg</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters.onebot.v11 <span class="keyword">import</span> Message, MessageEvent</span><br><span class="line"><span class="keyword">import</span> openai</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"></span><br><span class="line">__help_plugin_name__ = <span class="string">&quot;openai人工智能&quot;</span></span><br><span class="line">__help_version__ = <span class="string">&#x27;1.0&#x27;</span></span><br><span class="line">__usage__ = <span class="string">&#x27;命令1./ai &lt;参数：你想咨询的内容&gt;\n命令2./img &lt;参数1：你想生成的图片类型，参数2：生成的数量；默认1，参数3：图片大小；默认256*256,1=512*512,2=1024*1024\n命令3.&quot;&quot;&quot;这里输入要生成的代码内容&quot;&quot;&quot;&gt;&#x27;</span></span><br><span class="line"></span><br><span class="line">chatgpt_text = on_command(<span class="string">&quot;ai&quot;</span>, aliases=&#123;<span class="string">&quot;AI&quot;</span>&#125;, priority=<span class="number">1</span>)</span><br><span class="line"><span class="meta">@chatgpt_text.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">args: nonebot.adapters.Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    text = args.extract_plain_text()</span><br><span class="line">    <span class="keyword">if</span> text:</span><br><span class="line">        ai = chatGPT()</span><br><span class="line">        res = ai.set_text(text)</span><br><span class="line">        json_data = json.loads(res)</span><br><span class="line">        <span class="keyword">await</span> chatgpt_text.finish(json_data[<span class="string">&#x27;choices&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;text&#x27;</span>])</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">await</span> chatgpt_text.finish(<span class="string">&#x27;请输入你想咨询的问题&#x27;</span>)</span><br><span class="line"></span><br><span class="line">chatgpt_img = on_command(<span class="string">&quot;img&quot;</span>, aliases=&#123;<span class="string">&quot;img&quot;</span>&#125;, priority=<span class="number">1</span>)</span><br><span class="line"><span class="meta">@chatgpt_img.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">args: nonebot.adapters.Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    text = args.extract_plain_text()</span><br><span class="line">    <span class="keyword">if</span> text:</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&quot;,&quot;</span> <span class="keyword">in</span> text:</span><br><span class="line">            stt = text.split(<span class="string">&quot;,&quot;</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">len</span>(stt) == <span class="number">3</span>:</span><br><span class="line">                content = stt[<span class="number">0</span>]</span><br><span class="line">                x = stt[<span class="number">1</span>]</span><br><span class="line">                n = stt[<span class="number">2</span>]</span><br><span class="line">            <span class="keyword">elif</span> <span class="built_in">len</span>(stt) == <span class="number">2</span>:</span><br><span class="line">                content = stt[<span class="number">0</span>]</span><br><span class="line">                x = stt[<span class="number">1</span>]</span><br><span class="line">                n = <span class="number">0</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                content = stt[<span class="number">0</span>]</span><br><span class="line">                x = <span class="number">1</span></span><br><span class="line">                n = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            content = text</span><br><span class="line">            x = <span class="number">1</span></span><br><span class="line">            n = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">        ai = chatGPT()</span><br><span class="line">        res = ai.set_img(content, <span class="built_in">int</span>(x), <span class="built_in">int</span>(n))</span><br><span class="line">        json_data = json.loads(res)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> json_data[<span class="string">&#x27;data&#x27;</span>]:</span><br><span class="line">            cq = <span class="string">&quot;[CQ:image,file=%s]&quot;</span> % i[<span class="string">&#x27;url&#x27;</span>]</span><br><span class="line">            <span class="keyword">await</span> chatgpt_img.send(Message(cq))</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">await</span> chatgpt_img.finish(<span class="string">&#x27;请输入你想生成的图片类型&#x27;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">chatgpt_code = on_message(priority=<span class="number">2</span>, block=<span class="literal">False</span>)</span><br><span class="line"><span class="meta">@chatgpt_code.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">event: MessageEvent</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">isinstance</span>(event, MessageEvent):</span><br><span class="line">        <span class="keyword">for</span> msg <span class="keyword">in</span> event.message:</span><br><span class="line">            <span class="keyword">if</span> msg.<span class="built_in">type</span> == <span class="string">&quot;text&quot;</span>:</span><br><span class="line">                text: <span class="built_in">str</span> = msg.data[<span class="string">&quot;text&quot;</span>]</span><br><span class="line">                s_list = text.split(<span class="string">&#x27;&quot;&quot;&quot;&#x27;</span>)</span><br><span class="line">                <span class="keyword">if</span> <span class="built_in">len</span>(s_list) &gt;= <span class="number">3</span>:</span><br><span class="line">                    ai = chatGPT()</span><br><span class="line">                    res = ai.set_code(text, <span class="number">0</span>)</span><br><span class="line">                    json_data = json.loads(res)</span><br><span class="line">                    <span class="keyword">await</span> chatgpt_code.finish(json_data[<span class="string">&#x27;choices&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;text&#x27;</span>])</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">chatGPT</span>():</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line">        openai.organization = <span class="string">&quot;org-7YALDPRtMrCFNt7HpK5Wc8Z5&quot;</span></span><br><span class="line">        openai.api_key = <span class="string">&quot;sk-xxx&quot;</span>  <span class="comment"># https://openai.com/自己申请啊，免费的</span></span><br><span class="line">        <span class="comment"># model_list = openai.Model.list()</span></span><br><span class="line">        <span class="comment"># print(model_list)</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">set_text</span>(<span class="params">self, content</span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        res = openai.Completion.create(</span><br><span class="line">            model=<span class="string">&quot;text-davinci-003&quot;</span>,</span><br><span class="line">            prompt=content,</span><br><span class="line">            temperature=<span class="number">0.9</span>,</span><br><span class="line">            max_tokens=<span class="number">3900</span>,</span><br><span class="line">            top_p=<span class="number">1</span>,</span><br><span class="line">            frequency_penalty=<span class="number">0</span>,</span><br><span class="line">            presence_penalty=<span class="number">0.6</span></span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">str</span>(res)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">set_code</span>(<span class="params">self, content, n=<span class="number">1</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        model = <span class="string">&quot;code-cushman-001&quot;</span> <span class="keyword">if</span> n == <span class="number">1</span> <span class="keyword">else</span> <span class="string">&quot;code-davinci-002&quot;</span></span><br><span class="line">        x = <span class="number">2000</span> <span class="keyword">if</span> model == <span class="string">&quot;code-cushman-001&quot;</span> <span class="keyword">else</span> <span class="number">300</span></span><br><span class="line">        res = openai.Completion.create(</span><br><span class="line">            model=model,</span><br><span class="line">            prompt=content,</span><br><span class="line">            temperature=<span class="number">0</span>,</span><br><span class="line">            max_tokens=x,</span><br><span class="line">            top_p=<span class="number">1</span>,</span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">str</span>(res)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">set_img</span>(<span class="params">self, content, x=<span class="number">1</span>, n=<span class="number">0</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        生成图片</span></span><br><span class="line"><span class="string">        :param content: 图片内容</span></span><br><span class="line"><span class="string">        :param x: 图片数</span></span><br><span class="line"><span class="string">        :param n: 尺寸</span></span><br><span class="line"><span class="string">        :return:</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        size = <span class="string">&#x27;256x256&#x27;</span> <span class="keyword">if</span> n == <span class="number">0</span> <span class="keyword">else</span> <span class="string">&#x27;512x512&#x27;</span> <span class="keyword">if</span> n == <span class="number">1</span> <span class="keyword">else</span> <span class="string">&#x27;1024x1024&#x27;</span></span><br><span class="line">        res = openai.Image.create(</span><br><span class="line">            prompt=content,</span><br><span class="line">            n=x,</span><br><span class="line">            size=size</span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">str</span>(res)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    ai = chatGPT()</span><br><span class="line">    res = ai.set_code(<span class="string">&#x27;&quot;&quot;&quot;1. Create a list of first names2. Create a list of last names3. Combine them randomly into a list of 100 full names&quot;&quot;&quot;&#x27;</span>,<span class="number">0</span>)</span><br><span class="line">    <span class="built_in">print</span>(res)</span><br></pre></td></tr></table></figure><h1 id="Butterfly友链检查（非插件）"><a href="#Butterfly友链检查（非插件）" class="headerlink" title="Butterfly友链检查（非插件）"></a>Butterfly友链检查（非插件）</h1><ul><li>懒得再开一贴了直接藏在这了</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2022/7/14 22:13</span></span><br><span class="line"><span class="string">@Author  : superhero</span></span><br><span class="line"><span class="string">@Email   : 838210720@qq.com</span></span><br><span class="line"><span class="string">@File    : friendins.py</span></span><br><span class="line"><span class="string">@IDE: PyCharm</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> lxml <span class="keyword">import</span> etree</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> urllib <span class="keyword">import</span> parse</span><br><span class="line"><span class="comment"># 不支持友链大魔改的博客</span></span><br><span class="line"><span class="comment"># 准确率大概百分之90 有的友链是通过接口形式这个无法查询到</span></span><br><span class="line"></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">另外，有想加友链的可以先添加</span></span><br><span class="line"><span class="string">name： Superhero</span></span><br><span class="line"><span class="string">link： https://www.app966.cn/</span></span><br><span class="line"><span class="string">avatar： https://www.app966.cn/img/qq.jpg</span></span><br><span class="line"><span class="string">descr： 夜色难免黑凉，前行必有曙光</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_link</span>(<span class="params">url, ss=<span class="literal">False</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    检查自己的友链状态</span></span><br><span class="line"><span class="string">    :param url: 输入自己的博客友链</span></span><br><span class="line"><span class="string">    :param ss: 是从自己的博客友链获取还是自己添加去查询对方是否添加了自己，默认从自己博客获取</span></span><br><span class="line"><span class="string">    :return:</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 发现有些博客有检查user-agent，所以加上这个</span></span><br><span class="line">    header = &#123;<span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) &#x27;</span></span><br><span class="line">                            <span class="string">&#x27;Chrome/75.0.3770.142 Safari/537.36&#x27;</span>&#125;</span><br><span class="line">    <span class="keyword">if</span> ss <span class="keyword">is</span> <span class="literal">False</span>:</span><br><span class="line"></span><br><span class="line">        ret = requests.get(url, headers=header).content.decode(<span class="string">&#x27;utf8&#x27;</span>)</span><br><span class="line">        <span class="comment"># print(ret)</span></span><br><span class="line">        soup = etree.HTML(ret)</span><br><span class="line">        <span class="comment"># //*[@id=&quot;article-container&quot;]/div/div[2]/div[1]/a</span></span><br><span class="line">        <span class="comment"># //*[@id=&quot;article-container&quot;]/div/div[4]/div[1]/a/div[2]title cf-friends-name</span></span><br><span class="line">        <span class="comment"># //*[@id=&quot;article-container&quot;]/div/div[1]/div[1]/a[1]/div[2]/span[1]</span></span><br><span class="line">        friend_url = soup.xpath(<span class="string">&#x27;//*[@id=&quot;article-container&quot;]//@href&#x27;</span>)</span><br><span class="line">        <span class="comment"># friend_name = soup.xpath(&#x27;//*[@id=&quot;article-container&quot;]//div/a/div[@class=&quot;flink-item-name&quot;]/text()&#x27;)</span></span><br><span class="line">        <span class="comment"># 名字位置都不一样 就不判断了</span></span><br><span class="line">        <span class="comment"># friend_name = soup.xpath(&#x27;//*[@id=&quot;article-container&quot;]//span[@class=&quot;title&quot;]/text()&#x27;)</span></span><br><span class="line">        <span class="comment"># print(friend_name)</span></span><br><span class="line">        urls = re.findall(<span class="string">r&#x27;(?:http.?)://[-A-Za-z\d+&amp;@#/%?=~_|!:,.;]+[-A-Za-z\d+&amp;@#/%=~_|]&#x27;</span>, <span class="built_in">str</span>(friend_url))</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> urls:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;只支持Butterfly主题，只支持不魔改友链的&quot;</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        urls = [<span class="string">&#x27;想查对方是否有你在这输入对方的友链地址1&#x27;</span>, <span class="string">&#x27;想查对方是否有你在这输入对方的友链地址2&#x27;</span>]</span><br><span class="line"></span><br><span class="line">    n = <span class="built_in">len</span>(urls)</span><br><span class="line">    x = <span class="number">0</span></span><br><span class="line">    d = <span class="number">0</span></span><br><span class="line">    d1 = <span class="number">0</span></span><br><span class="line">    d2 = <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    success = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    none = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    error = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">import</span> urllib3</span><br><span class="line">    urllib3.disable_warnings()</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;检查开始了，你一共有[%s]个友链&quot;</span> % n)</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> urls:</span><br><span class="line">        x += <span class="number">1</span></span><br><span class="line">        friend_url = i</span><br><span class="line">        url1 = parse.urlparse(url).netloc</span><br><span class="line">        url2 = url1.split(<span class="string">&#x27;.&#x27;</span>)</span><br><span class="line">        <span class="built_in">max</span> = <span class="built_in">len</span>(url2)</span><br><span class="line">        url3 = url1 <span class="keyword">if</span> <span class="built_in">max</span> &lt; <span class="number">3</span> <span class="keyword">else</span> url2[<span class="built_in">max</span>-<span class="number">2</span>] + <span class="string">&quot;.&quot;</span> + url2[<span class="built_in">max</span>-<span class="number">1</span>]</span><br><span class="line">        <span class="keyword">if</span> url3 <span class="keyword">in</span> friend_url:</span><br><span class="line">            <span class="built_in">print</span>((friend_url + <span class="string">&quot;：第[&#123;0&#125;]个，自己就不检查了撒&quot;</span>).<span class="built_in">format</span>(<span class="built_in">str</span>(x)))</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> ss <span class="keyword">is</span> <span class="literal">False</span>:</span><br><span class="line">                <span class="comment"># 自己输入就不用加/link路径了</span></span><br><span class="line">                <span class="keyword">if</span> friend_url[<span class="built_in">len</span>(friend_url) - <span class="number">1</span>:] == <span class="string">&#x27;/&#x27;</span>:</span><br><span class="line">                    friend_url += <span class="string">&#x27;link/&#x27;</span></span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    friend_url += <span class="string">&#x27;/link/&#x27;</span></span><br><span class="line">            <span class="comment"># if &#x27;https&#x27; in friend_url:</span></span><br><span class="line">            <span class="comment">#     friend_url = &#x27;http&#x27; + friend_url[5:]</span></span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                ret = requests.get(friend_url, timeout=<span class="number">3</span>, headers=header, verify=<span class="literal">False</span>)</span><br><span class="line">                <span class="keyword">if</span> <span class="keyword">not</span> ret.status_code == <span class="number">200</span>:</span><br><span class="line">                    d += <span class="number">1</span></span><br><span class="line">                    error += friend_url + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">                    <span class="built_in">print</span>((<span class="string">&quot;第[&#123;0&#125;]个，链接有误，可能友链不是link，进度：&quot;</span> + <span class="built_in">str</span>(<span class="built_in">round</span>(x / n * <span class="number">100</span>, <span class="number">1</span>)) + <span class="string">&quot;%&quot;</span>).<span class="built_in">format</span>(<span class="built_in">str</span>(x)))</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="comment"># soup = etree.HTML(ret.text)</span></span><br><span class="line">                    <span class="comment"># ffriend_url = soup.xpath(&#x27;//*[@id=&quot;article-container&quot;]//@href&#x27;)</span></span><br><span class="line">                    <span class="keyword">if</span> url1 <span class="keyword">in</span> <span class="built_in">str</span>(ret.text):</span><br><span class="line">                        d1 += <span class="number">1</span></span><br><span class="line">                        success += friend_url + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">                        <span class="built_in">print</span>((<span class="string">&quot;第[&#123;0&#125;]个，添加我了，进度：&quot;</span> + <span class="built_in">str</span>(<span class="built_in">round</span>(x / n * <span class="number">100</span>, <span class="number">1</span>)) + <span class="string">&quot;%&quot;</span>).<span class="built_in">format</span>(<span class="built_in">str</span>(x)))</span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        d2 += <span class="number">1</span></span><br><span class="line">                        none += friend_url + <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">                        <span class="built_in">print</span>((<span class="string">&quot;第[&#123;0&#125;]个，没有添加我，进度：&quot;</span> + <span class="built_in">str</span>(<span class="built_in">round</span>(x / n * <span class="number">100</span>, <span class="number">1</span>)) + <span class="string">&quot;%&quot;</span>).<span class="built_in">format</span>(<span class="built_in">str</span>(x)))</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">                <span class="built_in">print</span>(e)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;统计结果：\n链接有误的有%s个，其中添加了我的有%s个，没有添加我的有%s个\n&#x27;</span> % (<span class="built_in">str</span>(d), <span class="built_in">str</span>(d1), <span class="built_in">str</span>(d2)) + <span class="string">&#x27;添加了我的：\n&#x27;</span> + success + <span class="string">&#x27;未添加我的：\n&#x27;</span> + none + <span class="string">&#x27;链接可能存在错误的：\n&#x27;</span> + error)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_str_btw</span>(<span class="params">s, f, b</span>):</span><br><span class="line">    par = s.partition(f)</span><br><span class="line">    <span class="keyword">return</span> (par[<span class="number">2</span>].partition(b))[<span class="number">0</span>][:]</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    <span class="comment"># 输入待检查的博客友链地址即可</span></span><br><span class="line">    url = <span class="string">&#x27;https://app966.cn/link/&#x27;</span></span><br><span class="line">    get_link(url)</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;div class=&quot;tip bell faa-horizontal animated&quot;&gt;&lt;p&gt;注意插件的版本号，有新版本我会同步更新&lt;/p&gt;
</summary>
      
    
    
    
    <category term="python" scheme="https://www.app966.cn/categories/python/"/>
    
    
    <category term="python" scheme="https://www.app966.cn/tags/python/"/>
    
    <category term="onebot" scheme="https://www.app966.cn/tags/onebot/"/>
    
  </entry>
  
  <entry>
    <title>python + go-cqhttp + nonebot搭建企鹅机器人相关教程</title>
    <link href="https://www.app966.cn/post/38eaae15.html"/>
    <id>https://www.app966.cn/post/38eaae15.html</id>
    <published>2022-07-08T11:51:11.000Z</published>
    <updated>2023-02-01T12:40:17.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><div class="tip warning faa-horizontal animated"><p>最好是有python基础否则安装以及开发插件会有点问题</p></div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>支持自己开发插件</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>支持多个机器人账号负载均衡</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>此源码是本人开发完善过的没有特殊要求可以直接使用</p>            </div><div class='checkbox times red checked'><input type="checkbox" checked="checked"/>            <p>请勿用于非法途径</p>            </div><h1 id="运行环境"><a href="#运行环境" class="headerlink" title="运行环境"></a>运行环境</h1><div class="tabs" id="运行环境"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#运行环境-1">v1</button></li><li class="tab"><button type="button" data-href="#运行环境-2">v2</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="运行环境-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">python == 3.7.3</span><br><span class="line">go-cqhttp == v1.0.0-rc3</span><br><span class="line">nonebot == v1.9.1</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="运行环境-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">python == 3.8</span><br><span class="line">go-cqhttp == v1.0.0-rc3</span><br><span class="line">nonebot == v2.0.0-beta.4</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">aiodns==3.0.0</span><br><span class="line">aiofile==3.7.4</span><br><span class="line">aiofiles==0.8.0</span><br><span class="line">aiohttp==3.8.1</span><br><span class="line">aiosignal==1.2.0</span><br><span class="line">anyio==3.6.1</span><br><span class="line">appdirs==1.4.4</span><br><span class="line">APScheduler==3.9.1</span><br><span class="line">arrow==1.2.2</span><br><span class="line">asgiref==3.5.2</span><br><span class="line">async-timeout==4.0.2</span><br><span class="line">asyncio-dgram==2.1.2</span><br><span class="line">attrs==21.4.0</span><br><span class="line">backports.zoneinfo==0.2.1</span><br><span class="line">beautifulsoup4==4.11.1</span><br><span class="line">binaryornot==0.4.4</span><br><span class="line">Brotli==1.0.9</span><br><span class="line">brotlipy==0.7.0</span><br><span class="line">cachetools==5.2.0</span><br><span class="line">caio==0.9.6</span><br><span class="line">cchardet==2.1.7</span><br><span class="line">certifi==2021.10.8</span><br><span class="line">cffi @ file:///C:/ci_310/cffi_1642682485096/work</span><br><span class="line">chardet==5.0.0</span><br><span class="line">charset-normalizer @ file:///tmp/build/80754af9/charset-normalizer_1630003229654/work</span><br><span class="line">click==8.1.3</span><br><span class="line">cn2an==0.5.17</span><br><span class="line">colorama @ file:///tmp/build/80754af9/colorama_1607707115595/work</span><br><span class="line">conda==4.12.0</span><br><span class="line">conda-content-trust @ file:///tmp/build/80754af9/conda-content-trust_1617045594566/work</span><br><span class="line">conda-package-handling @ file:///C:/ci/conda-package-handling_1649105961774/work</span><br><span class="line">cookiecutter==1.7.3</span><br><span class="line">cryptography @ file:///C:/ci/cryptography_1639472366776/work</span><br><span class="line">dateparser==1.1.1</span><br><span class="line">Django==4.0.6</span><br><span class="line">dnspython==2.2.1</span><br><span class="line">fastapi==0.78.0</span><br><span class="line">frozenlist==1.3.0</span><br><span class="line">fuzzyfinder==2.1.0</span><br><span class="line">h11==0.12.0</span><br><span class="line">h2==4.1.0</span><br><span class="line">hpack==4.0.0</span><br><span class="line">httpcore==0.15.0</span><br><span class="line">httptools==0.4.0</span><br><span class="line">httpx==0.23.0</span><br><span class="line">hyperframe==6.0.1</span><br><span class="line">idna @ file:///tmp/build/80754af9/idna_1637925883363/work</span><br><span class="line">image==1.5.33</span><br><span class="line">importlib-metadata==4.12.0</span><br><span class="line">jieba==0.42.1</span><br><span class="line">Jinja2==3.1.2</span><br><span class="line">jinja2-time==0.2.0</span><br><span class="line">loguru==0.6.0</span><br><span class="line">logzero==1.7.0</span><br><span class="line">lxml==4.9.1</span><br><span class="line">MarkupSafe==2.1.1</span><br><span class="line">mcstatus==9.2.0</span><br><span class="line">menuinst @ file:///C:/ci/menuinst_1631733428175/work</span><br><span class="line">msgpack==1.0.4</span><br><span class="line">multidict==6.0.2</span><br><span class="line">nb-cli==0.6.7</span><br><span class="line">nonebot-adapter-cqhttp==2.0.0b1</span><br><span class="line">nonebot-adapter-onebot==2.0.0b1</span><br><span class="line">nonebot-plugin-admin==0.3.21</span><br><span class="line">nonebot-plugin-apscheduler==0.1.2</span><br><span class="line">nonebot-plugin-gamedraw==0.3.8</span><br><span class="line">nonebot-plugin-help==0.3.1</span><br><span class="line">nonebot-plugin-status==0.4.0</span><br><span class="line">nonebot2==2.0.0b4</span><br><span class="line">Pillow==9.2.0</span><br><span class="line">poyo==0.5.0</span><br><span class="line">proces==0.1.2</span><br><span class="line">prompt-toolkit==3.0.30</span><br><span class="line">psutil==5.9.1</span><br><span class="line">pycares==4.2.1</span><br><span class="line">pycosat==0.6.3</span><br><span class="line">pycparser @ file:///tmp/build/80754af9/pycparser_1636541352034/work</span><br><span class="line">pycryptodome==3.15.0</span><br><span class="line">pydantic==1.9.1</span><br><span class="line">pyee==8.2.2</span><br><span class="line">PyExecJS==1.5.1</span><br><span class="line">pyfiglet==0.8.post1</span><br><span class="line">pygtrie==2.4.2</span><br><span class="line">pyncm==1.6.6.6</span><br><span class="line">pyOpenSSL @ file:///opt/conda/conda-bld/pyopenssl_1643788558760/work</span><br><span class="line">pypinyin==0.42.1</span><br><span class="line">pyppeteer==1.0.2</span><br><span class="line">PySocks @ file:///C:/ci/pysocks_1605287845585/work</span><br><span class="line">python-dateutil==2.8.2</span><br><span class="line">python-dotenv==0.20.0</span><br><span class="line">python-slugify==6.1.2</span><br><span class="line">pytz==2022.1</span><br><span class="line">pytz-deprecation-shim==0.1.0.post0</span><br><span class="line">pywin32==302</span><br><span class="line">PyYAML==6.0</span><br><span class="line">qrcode==7.3.1</span><br><span class="line">regex==2022.3.2</span><br><span class="line">requests==2.28.1</span><br><span class="line">rfc3986==1.5.0</span><br><span class="line">ruamel-yaml-conda @ file:///C:/ci/ruamel_yaml_1616016967756/work</span><br><span class="line">ruamel.yaml==0.17.21</span><br><span class="line">ruamel.yaml.clib==0.2.6</span><br><span class="line">six @ file:///tmp/build/80754af9/six_1644875935023/work</span><br><span class="line">sniffio==1.2.0</span><br><span class="line">soupsieve==2.3.2.post1</span><br><span class="line">sqlparse==0.4.2</span><br><span class="line">starlette==0.19.1</span><br><span class="line">tencentcloud-sdk-python==3.0.673</span><br><span class="line">text-unidecode==1.3</span><br><span class="line">tinydb==4.7.0</span><br><span class="line">tomlkit==0.10.2</span><br><span class="line">tqdm @ file:///opt/conda/conda-bld/tqdm_1647339053476/work</span><br><span class="line">typing_extensions==4.3.0</span><br><span class="line">tzdata==2022.1</span><br><span class="line">tzlocal==4.2</span><br><span class="line">ujson==5.4.0</span><br><span class="line">urllib3 @ file:///opt/conda/conda-bld/urllib3_1643638302206/work</span><br><span class="line">uvicorn==0.17.6</span><br><span class="line">watchgod==0.8.2</span><br><span class="line">wcwidth==0.2.5</span><br><span class="line">websockets==10.3</span><br><span class="line">win-inet-pton @ file:///C:/ci/win_inet_pton_1605306167264/work</span><br><span class="line">win32-setctime==1.1.0</span><br><span class="line">wincertstore==0.2</span><br><span class="line">yarl==1.7.2</span><br><span class="line">zhconv==1.4.3</span><br><span class="line">zipp==3.8.0</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h1 id="目录结构"><a href="#目录结构" class="headerlink" title="目录结构"></a>目录结构</h1><div class="tabs" id="目录结构"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#目录结构-1">v1</button></li><li class="tab"><button type="button" data-href="#目录结构-2">v2</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="目录结构-1"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">awesome-bot</span><br><span class="line">├── awesome</span><br><span class="line">│   └── plugins</span><br><span class="line">│       └── ai_chat.py # 腾讯NLP插件 用于智能回答 https://cloud.tencent.com/product/nlp</span><br><span class="line">│       └── bing.py # 必应壁纸插件</span><br><span class="line">│       └── getping.py # tcping插件</span><br><span class="line">│       └── group_admin.py # QQ群相关插件</span><br><span class="line">│       └── history.py # 历史的今天插件</span><br><span class="line">│       └── time.py # 时间插件</span><br><span class="line">│       └── usage.py # 帮助中心</span><br><span class="line">│       └── weather.py # 天气插件</span><br><span class="line">│       └── weibohot.py # 微博热搜插件</span><br><span class="line">│       └── wyy.py # 网易云音乐插件</span><br><span class="line">├── bot.py # 机器人运行</span><br><span class="line">└── config.py # 机器人配置</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="目录结构-2"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">📦 AweSome-Bot</span><br><span class="line">├── 📂 awesome_bot         # 或是 src</span><br><span class="line">│   └── 📜 plugins         # 插件目录</span><br><span class="line">├── 📜 .env                # config选择</span><br><span class="line">├── 📜 .env.dev            # 可选的[可作为调试环境]</span><br><span class="line">├── 📜 .env.prod           # 可选的[生产环境]</span><br><span class="line">├── 📜 .gitignore</span><br><span class="line">├── 📜 bot.py</span><br><span class="line">├── 📜 docker-compose.yml</span><br><span class="line">├── 📜 Dockerfile</span><br><span class="line">├── 📜 pyproject.toml</span><br><span class="line">└── 📜 README.md</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><p><strong>下载 <a href="/file/awesome-bot.zip">bot_v1.zip</a></strong><br><div class="tip cogs"><p>bot_v1.zip是包含插件的源码，安装配置python、go-cqhttp可简单使用</p></div></p><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><div class="tabs" id="安装"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#安装-1">v1</button></li><li class="tab"><button type="button" data-href="#安装-2">v2</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="安装-1"><ul><li>安装nonebot</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">pip install nonebot</span><br></pre></td></tr></table></figure><ul><li>安装<a href="https://github.com/Mrs4s/go-cqhttp/releases">go-cqhttp</a></li><li>配置go-cqhttp</li></ul><ol><li>双击<code>go-cqhttp_windows.exe</code>会生成一个<code>.bat</code>文件</li><li>运行.bat文件<code>选择反向Websocket通信</code></li><li>修改<code>config.yml</code>配置文件</li></ol><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 输入自己的账号密码</span></span><br><span class="line"><span class="attr">account:</span> <span class="comment"># 账号相关</span></span><br><span class="line">  <span class="attr">uin:</span> <span class="number">1233456</span> <span class="comment"># QQ账号</span></span><br><span class="line">  <span class="attr">password:</span> <span class="string">&#x27;&#x27;</span> <span class="comment"># 密码为空时使用扫码登录</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 输入python 服务的地址</span></span><br><span class="line"><span class="attr">servers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">ws-reverse:</span></span><br><span class="line">      <span class="attr">universal:</span> <span class="string">ws://127.0.0.1:8080/ws/</span></span><br></pre></td></tr></table></figure><ul><li>运行</li></ul><ol><li>运行go-cqhttp.bat和bot.py</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="安装-2"><ul><li>安装nonebot</li></ul><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">pip uninstall nonebot # 先卸载v1</span><br><span class="line">pip install nb-cli</span><br><span class="line"></span><br><span class="line">nb driver install httpx # 安装驱动</span><br><span class="line">nb driver install aiohttp # 安装驱动</span><br><span class="line"></span><br><span class="line">nb adapter install nonebot-adapter-onebot # 安装适配器</span><br><span class="line"></span><br><span class="line">nb create # 创建项目 选择“src”-选中(空格选中)“echo”-选中(空格选中)“OneBot V11”</span><br></pre></td></tr></table></figure><ul><li>安装<a href="https://github.com/Mrs4s/go-cqhttp/releases">go-cqhttp</a></li><li>配置go-cqhttp</li></ul><ol><li>双击<code>go-cqhttp_windows.exe</code>会生成一个<code>.bat</code>文件</li><li>运行.bat文件<code>选择反向Websocket通信</code></li><li>修改<code>config.yml</code>配置文件</li></ol><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 输入自己的账号密码</span></span><br><span class="line"><span class="attr">account:</span> <span class="comment"># 账号相关</span></span><br><span class="line">  <span class="attr">uin:</span> <span class="number">1233456</span> <span class="comment"># QQ账号</span></span><br><span class="line">  <span class="attr">password:</span> <span class="string">&#x27;&#x27;</span> <span class="comment"># 密码为空时使用扫码登录</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 输入python 服务的地址</span></span><br><span class="line"><span class="attr">servers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">ws-reverse:</span></span><br><span class="line">      <span class="attr">universal:</span> <span class="string">ws://127.0.0.1:8080/onebot/v11/ws/</span></span><br></pre></td></tr></table></figure><ul><li>运行</li></ul><ol><li>运行go-cqhttp.bat</li><li>nb run</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h1 id="遇到的问题"><a href="#遇到的问题" class="headerlink" title="遇到的问题"></a>遇到的问题</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">报错ValueError: invalid literal for int() with base 10: b&#x27;\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&#x27;</span><br><span class="line">把FASTAPI_RELOAD=false即可解决</span><br><span class="line"></span><br><span class="line">不行就运行netsh winsock reset</span><br><span class="line"></span><br><span class="line">nb create创建项目时空格选中目标</span><br></pre></td></tr></table></figure><ul><li>结束</li></ul><ol><li>完成以上配置基本就能用了更多插件需要自己开发了</li><li><a href="https://docs.nonebot.dev/">nonebot文档</a></li><li><a href="https://github.com/Mrs4s/go-cqhttp">go-cqhttp</a></li></ol><h1 id="插件相关"><a href="#插件相关" class="headerlink" title="插件相关"></a>插件相关</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 加载别人的插件</span><br><span class="line">nonebot.load_plugin(&quot;path.to.your.plugin&quot;)</span><br><span class="line"></span><br><span class="line"># 加载自己开发的插件</span><br><span class="line">nonebot.load_plugins(&quot;src/plugins&quot;, &quot;path/to/your/plugins&quot;)</span><br></pre></td></tr></table></figure><h2 id="开发天气插件示例"><a href="#开发天气插件示例" class="headerlink" title="开发天气插件示例"></a>开发天气插件示例</h2><div class="tabs" id="开发插件"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#开发插件-1">v1</button></li><li class="tab"><button type="button" data-href="#开发插件-2">v2</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="开发插件-1"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command, CommandSession</span><br><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_natural_language, NLPSession, IntentCommand</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> jieba <span class="keyword">import</span> posseg</span><br><span class="line">__plugin_name__ = <span class="string">&#x27;天气查询 示例/天气 北京&#x27;</span></span><br><span class="line">__plugin_usage__ = <span class="string">r&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">示例 /天气[城市名]</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_tianqi</span>(<span class="params">city</span>):</span><br><span class="line">    url = <span class="string">&#x27;http://autodev.openspeech.cn/csp/api/v2.1/weather?openId=aiuicus&amp;clientType=android&amp;sign=android&amp;city=&#x27;</span> + city + <span class="string">&#x27;&amp;needMoreData=true&amp;pageNo=1&amp;pageSize=1&#x27;</span></span><br><span class="line">    ret = requests.get(url).json()</span><br><span class="line">    <span class="keyword">if</span> ret.get(<span class="string">&#x27;msg&#x27;</span>, <span class="string">&#x27;&#x27;</span>) == <span class="string">&#x27;操作成功&#x27;</span>:</span><br><span class="line">        title = <span class="string">&#x27;&#x27;</span></span><br><span class="line">        <span class="keyword">if</span> ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;moreData&#x27;</span>].get(<span class="string">&#x27;alert&#x27;</span>, <span class="literal">None</span>) <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">            title = <span class="string">&#x27;\n&#x27;</span> + <span class="string">&#x27;预警信息：&#x27;</span> + ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;moreData&#x27;</span>][<span class="string">&#x27;alert&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;title&#x27;</span>]</span><br><span class="line">        txt = <span class="string">f&#x27;<span class="subst">&#123;city&#125;</span>当前的温度是&#x27;</span>+<span class="built_in">str</span>(ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;temp&#x27;</span>])+<span class="string">&#x27;度，&#x27;</span>+ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;weather&#x27;</span>]+<span class="string">&#x27;，空气&#x27;</span>+ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;airQuality&#x27;</span>]+<span class="string">&#x27;，PM2.5：&#x27;</span>+<span class="built_in">str</span>(ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;pm25&#x27;</span>])+title</span><br><span class="line"></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        txt = <span class="string">&#x27;null&#x27;</span></span><br><span class="line">    <span class="comment"># print(txt)</span></span><br><span class="line">    <span class="keyword">return</span> txt</span><br><span class="line"><span class="comment"># on_command 装饰器将函数声明为一个命令处理器</span></span><br><span class="line"><span class="comment"># 这里 weather 为命令的名字，同时允许使用别名「天气」「天气预报」「查天气」</span></span><br><span class="line"><span class="meta">@on_command(<span class="params"><span class="string">&#x27;weather&#x27;</span>, aliases=(<span class="params"><span class="string">&#x27;天气&#x27;</span>, <span class="string">&#x27;天气预报&#x27;</span>, <span class="string">&#x27;查天气&#x27;</span></span>)</span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">session: CommandSession</span>):</span><br><span class="line">    <span class="comment"># 取得消息的内容，并且去掉首尾的空白符</span></span><br><span class="line">    city = session.current_arg_text.strip()</span><br><span class="line">    <span class="comment"># 如果除了命令的名字之外用户还提供了别的内容，即用户直接将城市名跟在命令名后面，</span></span><br><span class="line">    <span class="comment"># 则此时 city 不为空。例如用户可能发送了：&quot;天气 南京&quot;，则此时 city == &#x27;南京&#x27;</span></span><br><span class="line">    <span class="comment"># 否则这代表用户仅发送了：&quot;天气&quot; 二字，机器人将会向其发送一条消息并且等待其回复</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> city:</span><br><span class="line">        city = (<span class="keyword">await</span> session.aget(prompt=<span class="string">&#x27;你想查询哪个城市的天气呢？&#x27;</span>)).strip()</span><br><span class="line">        <span class="comment"># 如果用户只发送空白符，则继续询问</span></span><br><span class="line">        <span class="keyword">while</span> <span class="keyword">not</span> city:</span><br><span class="line">            city = (<span class="keyword">await</span> session.aget(prompt=<span class="string">&#x27;要查询的城市名称不能为空呢，请重新输入&#x27;</span>)).strip()</span><br><span class="line">    <span class="comment"># 获取城市的天气预报</span></span><br><span class="line">    weather_report = get_tianqi(city)</span><br><span class="line">    <span class="comment"># 向用户发送天气预报</span></span><br><span class="line">    <span class="keyword">await</span> session.send(weather_report)</span><br><span class="line"></span><br><span class="line"><span class="meta">@on_natural_language(<span class="params">keywords=&#123;<span class="string">&#x27;天气&#x27;</span>&#125;</span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">_</span>(<span class="params">session: NLPSession</span>):</span><br><span class="line">    <span class="comment"># 去掉消息首尾的空白符</span></span><br><span class="line">    stripped_msg = session.msg_text.strip()</span><br><span class="line">    <span class="comment"># 对消息进行分词和词性标注</span></span><br><span class="line">    words = posseg.lcut(stripped_msg)</span><br><span class="line"></span><br><span class="line">    city = <span class="literal">None</span></span><br><span class="line">    <span class="comment"># 遍历 posseg.lcut 返回的列表</span></span><br><span class="line">    <span class="keyword">for</span> word <span class="keyword">in</span> words:</span><br><span class="line">        <span class="comment"># 每个元素是一个 pair 对象，包含 word 和 flag 两个属性，分别表示词和词性</span></span><br><span class="line">        <span class="keyword">if</span> word.flag == <span class="string">&#x27;ns&#x27;</span>:</span><br><span class="line">            <span class="comment"># ns 词性表示地名</span></span><br><span class="line">            city = word.word</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 返回意图命令，前两个参数必填，分别表示置信度和意图命令名</span></span><br><span class="line">    <span class="keyword">return</span> IntentCommand(<span class="number">90.0</span>, <span class="string">&#x27;weather&#x27;</span>, current_arg=city <span class="keyword">or</span> <span class="string">&#x27;&#x27;</span>)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="开发插件-2"><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> nonebot <span class="keyword">import</span> on_command</span><br><span class="line"><span class="keyword">from</span> nonebot.matcher <span class="keyword">import</span> Matcher</span><br><span class="line"><span class="keyword">from</span> nonebot.adapters <span class="keyword">import</span> Message</span><br><span class="line"><span class="keyword">from</span> nonebot.params <span class="keyword">import</span> Arg, CommandArg, ArgPlainText</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> nonebot.plugin</span><br><span class="line"></span><br><span class="line">__plugin_meta__ = nonebot.plugin.PluginMetadata(</span><br><span class="line">    name=<span class="string">&#x27;获取天气信息&#x27;</span>,</span><br><span class="line">    description=<span class="string">&#x27;按城市获取天气信息&#x27;</span>,</span><br><span class="line">    usage=<span class="string">&#x27;&#x27;&#x27;命令/天气 北京&lt;参数：城市&gt;&#x27;&#x27;&#x27;</span>,</span><br><span class="line">    extra=&#123;<span class="string">&#x27;version&#x27;</span>: <span class="string">&#x27;1.0&#x27;</span>&#125;</span><br><span class="line">)</span><br><span class="line">__help_version__ = <span class="string">&#x27;1.0&#x27;</span></span><br><span class="line">weather = on_command(<span class="string">&quot;weather&quot;</span>, aliases=&#123;<span class="string">&quot;天气&quot;</span>, <span class="string">&quot;天气预报&quot;</span>&#125;, priority=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@weather.handle()</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_first_receive</span>(<span class="params">matcher: Matcher, args: Message = CommandArg(<span class="params"></span>)</span>):</span><br><span class="line">    plain_text = args.extract_plain_text()  <span class="comment"># 首次发送命令时跟随的参数，例：/天气 上海，则args为上海</span></span><br><span class="line">    <span class="keyword">if</span> plain_text:</span><br><span class="line">        matcher.set_arg(<span class="string">&quot;city&quot;</span>, args)  <span class="comment"># 如果用户发送了参数则直接赋值</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@weather.got(<span class="params"><span class="string">&quot;city&quot;</span>, prompt=<span class="string">&quot;你想查询哪个城市的天气呢？&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">handle_city</span>(<span class="params">city: Message = Arg(<span class="params"></span>), city_name: <span class="built_in">str</span> = ArgPlainText(<span class="params"><span class="string">&quot;city&quot;</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> city_name:  <span class="comment"># 如果参数不符合要求，则提示用户重新输入</span></span><br><span class="line">        <span class="comment"># 可以使用平台的 Message 类直接构造模板消息</span></span><br><span class="line">        <span class="keyword">await</span> weather.reject(city.template(<span class="string">&quot;要查询的城市名称不能为空呢，请重新输入&quot;</span>))</span><br><span class="line"></span><br><span class="line">    city_weather = <span class="keyword">await</span> get_weather(city_name)</span><br><span class="line">    <span class="keyword">await</span> weather.finish(city_weather)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">get_weather</span>(<span class="params">city: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    url = <span class="string">&#x27;http://autodev.openspeech.cn/csp/api/v2.1/weather?openId=aiuicus&amp;clientType=android&amp;sign=android&amp;city=&#x27;</span> + city + <span class="string">&#x27;&amp;needMoreData=true&amp;pageNo=1&amp;pageSize=1&#x27;</span></span><br><span class="line">    ret = requests.get(url).json()</span><br><span class="line">    <span class="keyword">if</span> ret.get(<span class="string">&#x27;msg&#x27;</span>, <span class="string">&#x27;&#x27;</span>) == <span class="string">&#x27;操作成功&#x27;</span>:</span><br><span class="line">        title = <span class="string">&#x27;&#x27;</span></span><br><span class="line">        <span class="keyword">if</span> ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;moreData&#x27;</span>].get(<span class="string">&#x27;alert&#x27;</span>, <span class="literal">None</span>) <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">            title = <span class="string">&#x27;\n&#x27;</span> + <span class="string">&#x27;预警信息：&#x27;</span> + ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;moreData&#x27;</span>][<span class="string">&#x27;alert&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;title&#x27;</span>]</span><br><span class="line">        txt = <span class="string">f&#x27;<span class="subst">&#123;city&#125;</span>当前的温度是&#x27;</span>+<span class="built_in">str</span>(ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;temp&#x27;</span>])+<span class="string">&#x27;度，&#x27;</span>+ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;weather&#x27;</span>]+<span class="string">&#x27;，空气&#x27;</span>+ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;airQuality&#x27;</span>]+<span class="string">&#x27;，PM2.5：&#x27;</span>+<span class="built_in">str</span>(ret[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;list&#x27;</span>][<span class="number">0</span>][<span class="string">&#x27;pm25&#x27;</span>])+title</span><br><span class="line"></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        txt = <span class="string">&#x27;null&#x27;</span></span><br><span class="line">    <span class="comment"># print(txt)</span></span><br><span class="line">    <span class="keyword">return</span> txt</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h1 id="已支持的功能及命令"><a href="#已支持的功能及命令" class="headerlink" title="已支持的功能及命令"></a>已支持的功能及命令</h1><div class="tip cogs"><p>除被动功能所有命令都需要加“/”触发</p></div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>必应壁纸 示例/bing 1[表示获取1天前的]</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>历史上的今天 示例/历史</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>/help 示例/help 网易云音乐</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>抽卡游戏 示例/原神角色2抽</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>微博热搜榜 示例/热搜 10[条数默认10，&gt;15将逐条获取]</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>ping域名 示例/ping www.app966.com</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>天气查询 示例/天气 北京</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>网易点歌 示例/点歌 歌曲名</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>网易下载 示例/wyys 歌曲名</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>酷我点歌 示例/kwplay 歌曲名</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>酷我下载 示例/kwdow 歌曲名</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>历史上的今天 示例/历史</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>人生重开模拟器 示例/remake</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>网易新闻 示例/news [条数默认10，&gt;10将逐条获取]</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>抖音视频解析 示例/抖音 视频链接</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>抖音添加喜欢的播主 示例/抖音添加 主页链接</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>抖音随机取添加的播主视频，每个群设置不同互相隔离 示例/dyget</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>防疫政策查询 示例/yiq 上海</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>群管系统</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>每日早间微语 被动功能，每日7:10自动发送</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>随机语录 示例/骚话/舔话</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>被动功能支持开关控制 示例/开关</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>淘宝商品优惠查询 打开手淘app-分享想查询的商品链接-复制到群内</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>收录查询 示例/record app966.cn</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>新增openai（chatgpt） 示例/AI 上课迟到了帮我写份500字的检讨</p>            </div><h2 id="群管系统命令"><a href="#群管系统命令" class="headerlink" title="群管系统命令"></a>群管系统命令</h2><ol><li>添加违禁词 命令/添加违禁词 待添加的违禁词【仅限管理】</li><li>加群处理 后台设置自动同意或拒绝，需回答正确的答案等，可实现自动同意或拒绝入群【需管理权限】</li><li>防撤回 命令/开关 防撤回【仅限管理】</li><li>禁言 命令/禁 @待禁言的人 禁言时间可不填【需管理权限】</li><li>解禁 命令/解 @待解除禁言的人【需管理权限】</li><li>踢人 命令/踢 @待踢出群聊的人【需管理权限】</li><li>拉黑并踢除 命令/黑 @待拉黑并踢出群聊的人【需管理权限】</li><li>撤回群成员消息 命令/撤回 @待撤回消息的人 撤回消息数量默认5【需管理权限】</li><li>双击机器人头像可以召唤他<div class="img-wrap"><div class="img-bg"><img class="img" src="/temp/img/群管_1.png"/></div></div><div class="img-wrap"><div class="img-bg"><img class="img" src="/temp/img/群管_2.png"/></div></div></li></ol><h2 id="openai（chatgpt）命令"><a href="#openai（chatgpt）命令" class="headerlink" title="openai（chatgpt）命令"></a>openai（chatgpt）命令</h2><div class="table-container"><table><thead><tr><th>命令</th><th>命令示例</th><th>参数释义</th></tr></thead><tbody><tr><td>命令1：/ai</td><td>/ai 以鲁迅的口吻写一盘散文 或 /ai 用java写一个访问百度的例子</td><td>1个参数，想用ai做什么，必填</td></tr><tr><td>命令2：/img</td><td>/img 老虎,2,1</td><td>有3个参数：老虎=图片类型，必填；2=生成图片数量，选填默认1；1=图片大小，选填默认256*256</td></tr><tr><td>命令3：”””内容”””</td><td>“””1. Create a list of first names2. Create a list of last names3. Combine them randomly into a list of 100 full names”””</td><td>注意格式即可，”””开头”””结尾</td></tr></tbody></table></div><h2 id="相关命令"><a href="#相关命令" class="headerlink" title="相关命令"></a>相关命令</h2><span class='p h4'>帮助命令</span><ol><li>help</li><li>help list （展示已加载插件列表）</li><li>help <plugin_name> （调取目标插件帮助信息，示例/help wyy）</li></ol><span class='p h4'>抽卡游戏命令</span><p><strong>原神</strong></p><ul><li>原神N抽 （常驻池）</li><li>原神角色N抽 （角色UP池）</li><li>原神武器N抽 （武器UP池）</li></ul><p><strong>赛马娘</strong></p><ul><li>赛马娘N抽 （抽马）</li><li>赛马娘卡N抽 （抽卡）</li></ul><p><strong>坎公骑冠剑</strong></p><ul><li>坎公骑冠剑N抽 （抽角色）</li><li>坎公骑冠剑武器N抽 （抽武器）</li></ul><p><strong>碧蓝航线</strong></p><ul><li>碧蓝轻型N抽 （轻型池）</li><li>碧蓝重型N抽 （重型池）</li><li>碧蓝特型N抽 （特型池）</li><li>碧蓝活动N抽 （活动池）</li></ul><p><strong>其他命令</strong></p><ul><li>重置原神抽卡（重置保底）</li><li>重载原神卡池</li><li>重载方舟卡池</li><li>重载赛马娘卡池</li><li>重载坎公骑冠剑卡池</li></ul><p><strong>更新命令</strong></p><ul><li>更新明日方舟信息</li><li>更新原神信息</li><li>更新赛马娘信息</li><li>更新坎公骑冠剑信息</li><li>更新pcr信息</li><li>更新碧蓝航线信息</li><li>更新fgo信息</li><li>更新阴阳师信息</li></ul><h1 id="如何使用本机器人"><a href="#如何使用本机器人" class="headerlink" title="如何使用本机器人"></a>如何使用本机器人</h1><ol><li>根据本教程自己搭建并使用我开源的<a href="/post/2134719b.html">插件</a></li><li>加入群聊<code>582392380</code>，回答内容需超过<code>8个字</code>或者回答<code>app966.cn</code></li><li>购买，购买后整个机器人都归你所有并可添加个性化功能定制</li></ol><h1 id="更多功能"><a href="#更多功能" class="headerlink" title="更多功能"></a>更多功能</h1><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>可付费定制更多功能</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>付费版可解锁更多强大的插件</p>            </div><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><ul><li>企鹅机器人相对还是比较简单的</li><li>百分之98以上插件是本人写的，有需要可以<a href="/post/2134719b.html">下载</a></li><li>免费版插件不会再更新了，没有那么多精力去搞</li><li>有其他需求付费定制的可以私聊我</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;div class=&quot;tip warning faa-horizontal animated&quot;&gt;&lt;p&gt;最好是有python基础否则安装以及开发插</summary>
      
    
    
    
    <category term="python" scheme="https://www.app966.cn/categories/python/"/>
    
    
    <category term="python" scheme="https://www.app966.cn/tags/python/"/>
    
    <category term="教程" scheme="https://www.app966.cn/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="go-cqhttp" scheme="https://www.app966.cn/tags/go-cqhttp/"/>
    
    <category term="onebot" scheme="https://www.app966.cn/tags/onebot/"/>
    
  </entry>
  
  <entry>
    <title>用python做一个高清壁纸下载器</title>
    <link href="https://www.app966.cn/post/a5f8adda.html"/>
    <id>https://www.app966.cn/post/a5f8adda.html</id>
    <published>2022-07-03T16:49:43.000Z</published>
    <updated>2023-01-26T12:46:36.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>支持4K高清</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>支持区分手机、电脑壁纸</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>本源码仅限用于学习交流</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>由于整理相册的需求所以做一个壁纸下载的工具</p>            </div><div class='checkbox times red checked'><input type="checkbox" checked="checked"/>            <p>请勿批量爬取</p>            </div><div class='checkbox times red checked'><input type="checkbox" checked="checked"/>            <p>请勿用于商业用途</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>使用后造成的损失与作者无关</p>            </div><h1 id="代码区"><a href="#代码区" class="headerlink" title="代码区"></a>代码区</h1><ul><li>代码开箱即用</li><li><a href="/file/wallpaper.py">下载wallpaper.py</a></li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> imagesize</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">wallpaper</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, page, download</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        默认是获取美女图片</span></span><br><span class="line"><span class="string">        :param page: 页数</span></span><br><span class="line"><span class="string">        :param download: 是否下载图片</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        self.page = page</span><br><span class="line">        self.download = download</span><br><span class="line">        self.header = &#123;</span><br><span class="line">            <span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0&#x27;</span></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> self.download:</span><br><span class="line">            self.div = <span class="string">r&quot;E:\\wallpaper&quot;</span></span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(self.div):</span><br><span class="line">                os.mkdir(self.div)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">downloader</span>(<span class="params">self, url, path, title</span>):</span><br><span class="line">        size = <span class="number">0</span></span><br><span class="line">        res = requests.get(url, stream=<span class="literal">True</span>)</span><br><span class="line">        chunk_size = <span class="number">1024</span></span><br><span class="line">        <span class="comment"># 每次下载数据大小</span></span><br><span class="line">        content_size = <span class="built_in">int</span>(res.headers[<span class="string">&quot;content-length&quot;</span>])</span><br><span class="line">        <span class="comment"># 总大小</span></span><br><span class="line">        <span class="keyword">if</span> res.status_code == <span class="number">200</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&#x27;[%s 文件大小]: %0.2f MB&#x27;</span> % (title, content_size / chunk_size / <span class="number">1024</span>))</span><br><span class="line">            <span class="keyword">with</span> <span class="built_in">open</span>(path, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">                <span class="keyword">for</span> data <span class="keyword">in</span> res.iter_content(chunk_size=chunk_size):</span><br><span class="line">                    f.write(data)</span><br><span class="line">                    size += <span class="built_in">len</span>(data)  <span class="comment"># 已下载文件大小</span></span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">&#x27;\r&#x27;</span> + <span class="string">&#x27;[下载进度]: %s%.2f%%&#x27;</span> % (<span class="string">&#x27;&gt;&#x27;</span> * <span class="built_in">int</span>(size * <span class="number">50</span> / content_size), <span class="built_in">float</span>(size / content_size * <span class="number">100</span>)), end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">update_name</span>(<span class="params">self, path</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        修改文件名，用于区分手机和电脑版</span></span><br><span class="line"><span class="string">        只支持jpg格式 其它格式在下面修改 或者单独放在一个文件夹内 删除第52行即可</span></span><br><span class="line"><span class="string">        :param path:</span></span><br><span class="line"><span class="string">        :return:</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;开始修改文件名&#x27;</span>)</span><br><span class="line">        file_list = os.listdir(path)</span><br><span class="line">        <span class="keyword">for</span> f <span class="keyword">in</span> file_list:</span><br><span class="line">            old_name = os.path.join(path, f)</span><br><span class="line">            <span class="keyword">if</span> old_name[<span class="number">3</span>:] == <span class="string">&#x27;jpg&#x27;</span>:</span><br><span class="line">                w, h = imagesize.get(old_name)</span><br><span class="line">                isphone = <span class="string">&#x27;_phone&#x27;</span> <span class="keyword">if</span> h &gt; w <span class="keyword">else</span> <span class="string">&#x27;_pc&#x27;</span></span><br><span class="line">                new_name = old_name[:<span class="built_in">len</span>(old_name) - <span class="number">6</span>] + isphone + <span class="string">&#x27;.jpg&#x27;</span></span><br><span class="line">                os.rename(old_name, new_name)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;文件名修改完毕&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_4kbz</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        默认是获取美女图片</span></span><br><span class="line"><span class="string">        获取其它类型请更改page</span></span><br><span class="line"><span class="string">        :return:</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="comment"># 先获取cookie</span></span><br><span class="line">        url = <span class="string">&#x27;https://www.4kbizhi.com/&#x27;</span></span><br><span class="line">        ret = requests.get(url, headers=self.header)</span><br><span class="line">        cookie = requests.utils.dict_from_cookiejar(ret.cookies)</span><br><span class="line">        self.header[<span class="string">&#x27;Cookie&#x27;</span>] = <span class="string">&#x27;__yjs_duid=&#x27;</span> + cookie[<span class="string">&#x27;__yjs_duid&#x27;</span>]</span><br><span class="line">        start = time.time()</span><br><span class="line">        <span class="keyword">for</span> n <span class="keyword">in</span> <span class="built_in">range</span>(self.page):</span><br><span class="line">            page = <span class="string">&#x27;meinv/index_&#x27;</span> + <span class="built_in">str</span>(n + <span class="number">1</span>) + <span class="string">&#x27;.html&#x27;</span> <span class="keyword">if</span> n &gt; <span class="number">0</span> <span class="keyword">else</span> <span class="string">&#x27;meinv/&#x27;</span></span><br><span class="line">            ret = requests.get(url + page, headers=self.header).content.decode(<span class="string">&#x27;gbk&#x27;</span>)</span><br><span class="line">            soup = BeautifulSoup(ret, <span class="string">&#x27;lxml&#x27;</span>)</span><br><span class="line">            tag = soup.find_all(<span class="string">&#x27;img&#x27;</span>)</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> tag:</span><br><span class="line">                img_key = re.sub(<span class="string">r&quot;\s&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="built_in">str</span>(i))</span><br><span class="line">                img_key = re.sub(<span class="string">r&quot;4k电脑壁纸&quot;</span>, <span class="string">&quot;&quot;</span>, img_key)</span><br><span class="line">                img_key = re.sub(<span class="string">r&quot;4k手机壁纸&quot;</span>, <span class="string">&quot;&quot;</span>, img_key)</span><br><span class="line">                img_key = re.sub(<span class="string">r&quot;4k美女壁纸&quot;</span>, <span class="string">&quot;&quot;</span>, img_key)</span><br><span class="line">                img_name = self.get_str_btw(img_key, <span class="string">&#x27;alt=&quot;&#x27;</span>, <span class="string">&#x27;&quot;&#x27;</span>)</span><br><span class="line">                <span class="keyword">if</span> img_name:</span><br><span class="line">                    img = re.sub(<span class="string">&quot;small&quot;</span>, <span class="string">&quot;&quot;</span>, img_key)</span><br><span class="line">                    img = self.get_str_btw(img, <span class="string">&#x27;src=&quot;&#x27;</span>, <span class="string">&#x27;&quot;&#x27;</span>)</span><br><span class="line">                    img = img[:<span class="built_in">len</span>(img) - <span class="number">14</span>] + <span class="string">&#x27;.jpg&#x27;</span></span><br><span class="line">                    <span class="keyword">if</span> <span class="built_in">len</span>(img) == <span class="number">34</span>:</span><br><span class="line">                        img = <span class="string">&#x27;https://www.4kbizhi.com&#x27;</span> + img</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">&#x27;\r&#x27;</span> + img_name, img)</span><br><span class="line">                        <span class="keyword">if</span> self.download:</span><br><span class="line">                            img_path = os.path.join(self.div, img_name + <span class="built_in">str</span>(random.randint(<span class="number">10</span>, <span class="number">99</span>)) + <span class="string">&#x27;.jpg&#x27;</span>)</span><br><span class="line">                            <span class="comment"># print(img_path)</span></span><br><span class="line">                            self.downloader(img, img_path, img_name)</span><br><span class="line">        <span class="keyword">if</span> self.download:</span><br><span class="line">            end = time.time()</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&#x27;\n&#x27;</span> + <span class="string">&quot;全部下载完成！用时%s秒&quot;</span> % <span class="built_in">round</span>(end - start, <span class="number">1</span>))</span><br><span class="line">            self.update_name(self.div)</span><br><span class="line"></span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        不完美 请求下面的接口即可注册cookie</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># challenge_token = get_str_btw(ret.text, &quot;window[&#x27;yjs_js_challenge_token&#x27;]=&#x27;&quot;, &quot;&#x27;&lt;/script&gt;&quot;)</span></span><br><span class="line">        <span class="comment"># print(cookie, challenge_token)</span></span><br><span class="line">        <span class="comment"># url = &#x27;https://www.4kbizhi.com/yjs-cgi/security/js_challenge/verify?token=&#x27; + challenge_token</span></span><br><span class="line">        <span class="comment"># data = &#123;&#125;</span></span><br><span class="line">        <span class="comment"># ret = requests.post(url, data=data, headers=header)</span></span><br><span class="line">        <span class="comment"># cookie = requests.utils.dict_from_cookiejar(ret.cookies)</span></span><br><span class="line">        <span class="comment"># print(ret.text)</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_jkrs</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        默认获取全部</span></span><br><span class="line"><span class="string">        获取其它类型请更改page</span></span><br><span class="line"><span class="string">        :return:</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&#x27;https://jk.rs/&#x27;</span></span><br><span class="line">        start = time.time()</span><br><span class="line">        <span class="keyword">for</span> n <span class="keyword">in</span> <span class="built_in">range</span>(self.page):</span><br><span class="line">            page = <span class="string">&#x27;page/%s/&#x27;</span> % <span class="built_in">str</span>(n + <span class="number">1</span>) <span class="keyword">if</span> n &gt; <span class="number">0</span> <span class="keyword">else</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">            ret = requests.get(url + page, headers=self.header).text</span><br><span class="line">            soup = BeautifulSoup(ret, <span class="string">&#x27;lxml&#x27;</span>)</span><br><span class="line">            tag = soup.find_all(<span class="string">&#x27;a&#x27;</span>, class_=<span class="string">&#x27;item-link&#x27;</span>)</span><br><span class="line">            <span class="comment"># print(tag)</span></span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> tag:</span><br><span class="line">                img_key = re.sub(<span class="string">r&quot;\s&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="built_in">str</span>(i))</span><br><span class="line">                <span class="comment"># print(img_key)</span></span><br><span class="line">                img_url = self.get_str_btw(img_key, <span class="string">&#x27;&quot;href=&quot;&#x27;</span>, <span class="string">&#x27;&quot;&gt;&#x27;</span>)</span><br><span class="line">                img_name = self.get_str_btw(img_key, <span class="string">&#x27;&quot;item-link-text&quot;&gt;&#x27;</span>, <span class="string">&#x27;&lt;/div&gt;&#x27;</span>)</span><br><span class="line">                ret = requests.get(img_url, headers=self.header).text</span><br><span class="line">                soup = BeautifulSoup(ret, <span class="string">&#x27;lxml&#x27;</span>)</span><br><span class="line">                tag2 = soup.find_all(<span class="string">&#x27;img&#x27;</span>, class_=<span class="string">&#x27;post-item-img lazy&#x27;</span>)</span><br><span class="line">                j = <span class="number">0</span></span><br><span class="line">                <span class="keyword">for</span> i1 <span class="keyword">in</span> tag2:</span><br><span class="line">                    j += <span class="number">1</span></span><br><span class="line">                    img_key2 = re.sub(<span class="string">r&quot;\s&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="built_in">str</span>(i1))</span><br><span class="line">                    img_name2 = self.get_str_btw(img_key2, <span class="string">&#x27;title=&quot;&#x27;</span>, <span class="string">&#x27;&quot;/&gt;&#x27;</span>)</span><br><span class="line">                    img_url2 = self.get_str_btw(img_key2, <span class="string">&#x27;data-original=&quot;&#x27;</span>, <span class="string">&#x27;&quot;src=&quot;&#x27;</span>)</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">&#x27;\n&#x27;</span> + <span class="string">&#x27;正在获取[%s]图集内的内容&#x27;</span> % (img_name + <span class="built_in">str</span>(j)))</span><br><span class="line">                    <span class="keyword">if</span> self.download:</span><br><span class="line">                        div = self.div + <span class="string">&quot;\\&quot;</span> + img_name</span><br><span class="line">                        <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(div):</span><br><span class="line">                            os.mkdir(div)</span><br><span class="line">                        img_path = os.path.join(div, img_name2 + <span class="string">&#x27;.jpg&#x27;</span>)</span><br><span class="line">                        self.downloader(img_url2, img_path, img_name2)</span><br><span class="line">                <span class="keyword">if</span> self.download:</span><br><span class="line">                    end = time.time()</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">&#x27;\n&#x27;</span> + img_name + <span class="string">&quot;下载完成！共用时%s秒&quot;</span> % <span class="built_in">round</span>(end - start, <span class="number">1</span>))</span><br><span class="line">                    <span class="comment"># 这个图片源没有必要去区分手机和电脑</span></span><br><span class="line">                    <span class="comment"># self.update_name(div)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_str_btw</span>(<span class="params">self, s, f, b</span>):</span><br><span class="line">        par = s.partition(f)</span><br><span class="line">        <span class="keyword">return</span> (par[<span class="number">2</span>].partition(b))[<span class="number">0</span>][:]</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    wall = wallpaper(download=<span class="literal">True</span>, page=<span class="number">5</span>)</span><br><span class="line">    <span class="comment"># 下载jk</span></span><br><span class="line">    wall.get_jkrs()</span><br><span class="line">    <span class="comment"># 下载4k</span></span><br><span class="line">    <span class="comment"># wall.get_4kbz()</span></span><br></pre></td></tr></table></figure><h1 id="成功示例"><a href="#成功示例" class="headerlink" title="成功示例"></a>成功示例</h1><ul><li><a href="/picture/wallpaper/index.html">查看图集</a></li></ul><div class="img-wrap"><div class="img-bg"><img class="img" src="/pic/wallpaper.png"/></div></div>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;div class=&#39;checkbox green checked&#39;&gt;&lt;input type=&quot;checkbox&quot; checked=&quot;check</summary>
      
    
    
    
    <category term="python" scheme="https://www.app966.cn/categories/python/"/>
    
    
    <category term="python" scheme="https://www.app966.cn/tags/python/"/>
    
    <category term="wallpaper" scheme="https://www.app966.cn/tags/wallpaper/"/>
    
  </entry>
  
  <entry>
    <title>java版抖音视频解析</title>
    <link href="https://www.app966.cn/post/ebfa80ed.html"/>
    <id>https://www.app966.cn/post/ebfa80ed.html</id>
    <published>2022-06-30T18:22:57.000Z</published>
    <updated>2023-04-21T02:35:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="使用idea导入相关依赖"><a href="#使用idea导入相关依赖" class="headerlink" title="使用idea导入相关依赖"></a>使用idea导入相关依赖</h1><span class='p left h3'>从maven导入模块</span><ul><li>在idea中按<code>F4</code>进入模块设置或选中项目单击右键，可以看到进入模块设置</li><li>点击添加，选择来自maven，然后搜索想要的模块添加上就行</li><li>最好把自动引入模块的设置打开，如下图</li></ul><div class="img-wrap"><div class="img-bg"><img class="img" src="/img/jx_3.png" alt="进入模块设置"/></div><span class="image-caption">进入模块设置</span></div><div class="img-wrap"><div class="img-bg"><img class="img" src="/img/jx_4.png" alt="搜索想要的模块"/></div><span class="image-caption">搜索想要的模块</span></div><div class="img-wrap"><div class="img-bg"><img class="img" src="/img/jx_5.png" alt="自动导入设置"/></div><span class="image-caption">自动导入设置</span></div><ul><li>也可以自己下载jar包放在<code>lib</code>目录下，并在<code>pom.xml</code>下添加如下代码，如下图</li></ul><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.alibaba<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>fastjson<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.2.76<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure><div class="img-wrap"><div class="img-bg"><img class="img" src="/img/jx_2.png" alt="导入fastjson"/></div><span class="image-caption">导入fastjson</span></div><h1 id="java代码"><a href="#java代码" class="headerlink" title="java代码"></a>java代码</h1><ul><li><p>新的方法</p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> text;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONArray;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONObject;</span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.net.HttpURLConnection;</span><br><span class="line"><span class="keyword">import</span> java.net.URL;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"><span class="keyword">import</span> java.util.regex.Matcher;</span><br><span class="line"><span class="keyword">import</span> java.util.regex.Pattern;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">dy_ana</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">get_play</span><span class="params">(String video_id)</span>&#123;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        获取无水印地址，新方法</span></span><br><span class="line"><span class="comment">        * */</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (video_id == <span class="literal">null</span>)&#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;请手动输入字符视频id&quot;</span>);</span><br><span class="line">            <span class="type">Scanner</span> <span class="variable">sc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">            video_id = sc.nextLine();</span><br><span class="line">            System.out.println(video_id);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">/* String url = &quot;https://www.douyin.com/aweme/v1/play/?video_id=%s&amp;line=0&amp;is_play_url=1&amp;source=PackSourceEnum_PUBLISH&quot;;</span></span><br><span class="line"><span class="comment">        url = String.format(url, video_id);</span></span><br><span class="line"><span class="comment">        * */</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">t</span> <span class="operator">=</span> String.valueOf(System.currentTimeMillis());</span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;https://api3-normal-c-hl.amemv.com/aweme/v1/multi/aweme/detail/?os_api=22&amp;device_type=MI+9&amp;ssmix=a&amp;manifest_version_code=120701&amp;dpi=240&amp;uuid=%s&amp;app_name=aweme&amp;version_name=12.7.0&amp;ts=%s&amp;cpu_support64=false&amp;storage_type=0&amp;app_type=normal&amp;appTheme=dark&amp;ac=wifi&amp;host_abi=armeabi-v7a&amp;update_version_code=12709900&amp;channel=tengxun_new&amp;_rticket=%s&amp;device_platform=android&amp;iid=%s&amp;version_code=120700&amp;mac_address=%s&amp;cdid=%s&amp;openudid=%s&amp;device_id=%s&amp;resolution=720*1280&amp;os_version=5.1.1&amp;language=zh&amp;device_brand=Android&amp;aid=1128&amp;mcc_mnc=46007&quot;</span>;</span><br><span class="line">        url = String.format(url, <span class="string">&quot;262745062603948&quot;</span>, t.substring(<span class="number">0</span>,<span class="number">10</span>), t, <span class="string">&quot;3479331501001230&quot;</span>, <span class="string">&quot;10:2a:b3:7e:e5:2e&quot;</span>, <span class="string">&quot;a8f935d1-6b88-458a-8d15-1561ed4256b6&quot;</span>, <span class="string">&quot;af455a5a9cd3e9b4&quot;</span>, <span class="string">&quot;242369266188781&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">params</span> <span class="operator">=</span> <span class="string">&quot;aweme_ids=[%s]&amp;origin_type=goods_rank_list_0&amp;push_params=&amp;request_source=0&quot;</span>;</span><br><span class="line">        params = String.format(params, video_id);</span><br><span class="line">        <span class="type">String</span> <span class="variable">ret</span> <span class="operator">=</span> PostUrl(url, params);</span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">obj</span> <span class="operator">=</span> JSONObject.parseObject(ret);</span><br><span class="line">        List&lt;Object&gt; Array = obj.getJSONArray(<span class="string">&quot;aweme_details&quot;</span>);</span><br><span class="line">        <span class="type">JSONArray</span> <span class="variable">jsonArray</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONArray</span>(Array);</span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">obj1</span> <span class="operator">=</span> jsonArray.getJSONObject(<span class="number">0</span>);</span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">obj2</span> <span class="operator">=</span> obj1.getJSONObject(<span class="string">&quot;video&quot;</span>);</span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">obj3</span> <span class="operator">=</span>  obj2.getJSONObject(<span class="string">&quot;play_addr&quot;</span>);</span><br><span class="line">        List&lt;Object&gt; Array1 = obj3.getJSONArray(<span class="string">&quot;url_list&quot;</span>);</span><br><span class="line">        <span class="type">JSONArray</span> <span class="variable">jsonArray1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONArray</span>(Array1);</span><br><span class="line">        <span class="keyword">return</span> jsonArray1.getString(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">PostUrl</span><span class="params">(String httpUrl, String param)</span> &#123;</span><br><span class="line"></span><br><span class="line">        <span class="type">HttpURLConnection</span> <span class="variable">connection</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">InputStream</span> <span class="variable">is</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">OutputStream</span> <span class="variable">os</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">BufferedReader</span> <span class="variable">br</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">URL</span> <span class="variable">url</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">URL</span>(httpUrl);</span><br><span class="line">            <span class="comment">// 通过远程url连接对象打开连接</span></span><br><span class="line">            connection = (HttpURLConnection) url.openConnection();</span><br><span class="line">            connection.setRequestMethod(<span class="string">&quot;POST&quot;</span>);</span><br><span class="line">            <span class="comment">// 默认值为：false，当向远程服务器传送数据/写数据时，需要设置为true</span></span><br><span class="line">            connection.setDoOutput(<span class="literal">true</span>);</span><br><span class="line">            <span class="comment">// 默认值为：true，当前向远程服务读取数据时，设置为true，该参数可有可无</span></span><br><span class="line">            connection.setDoInput(<span class="literal">true</span>);</span><br><span class="line">            <span class="comment">// 设置传入参数的格式:请求参数应该是 name1=value1&amp;name2=value2 的形式。</span></span><br><span class="line">            connection.setRequestProperty(<span class="string">&quot;Content-Type&quot;</span>, <span class="string">&quot;application/x-www-form-urlencoded&quot;</span>);</span><br><span class="line">            <span class="comment">// 通过连接对象获取一个输出流</span></span><br><span class="line">            os = connection.getOutputStream();</span><br><span class="line">            <span class="comment">// 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的</span></span><br><span class="line">            os.write(param.getBytes());</span><br><span class="line">            <span class="comment">// 通过连接对象获取一个输入流，向远程读取</span></span><br><span class="line">            <span class="keyword">if</span> (connection.getResponseCode() == <span class="number">200</span>) &#123;</span><br><span class="line"></span><br><span class="line">                is = connection.getInputStream();</span><br><span class="line">                <span class="comment">// 对输入流对象进行包装:charset根据工作项目组的要求来设置</span></span><br><span class="line">                br = <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">InputStreamReader</span>(is, <span class="string">&quot;UTF-8&quot;</span>));</span><br><span class="line"></span><br><span class="line">                <span class="type">StringBuilder</span> <span class="variable">sbf</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line">                <span class="type">String</span> <span class="variable">temp</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">                <span class="comment">// 循环遍历一行一行读取数据</span></span><br><span class="line">                <span class="keyword">while</span> ((temp = br.readLine()) != <span class="literal">null</span>) &#123;</span><br><span class="line">                    sbf.append(temp);</span><br><span class="line">                    sbf.append(<span class="string">&quot;\r\n&quot;</span>);</span><br><span class="line">                &#125;</span><br><span class="line">                result = sbf.toString();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">            <span class="comment">// 关闭资源</span></span><br><span class="line">            <span class="keyword">if</span> (<span class="literal">null</span> != br) &#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    br.close();</span><br><span class="line">                &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">                    e.printStackTrace();</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (<span class="literal">null</span> != os) &#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    os.close();</span><br><span class="line">                &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">                    e.printStackTrace();</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (<span class="literal">null</span> != is) &#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    is.close();</span><br><span class="line">                &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">                    e.printStackTrace();</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 断开与远程地址url的连接</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">assert</span> connection != <span class="literal">null</span>;</span><br><span class="line">            connection.disconnect();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">GetUrl</span><span class="params">(String url, <span class="type">boolean</span> ss)</span>&#123;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        get请求</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line">        <span class="type">BufferedReader</span> <span class="variable">reader</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">URL</span> <span class="variable">realloc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">URL</span>(url);</span><br><span class="line">            <span class="comment">//打开连接</span></span><br><span class="line">            <span class="type">HttpURLConnection</span> <span class="variable">connection</span> <span class="operator">=</span> (HttpURLConnection)realloc.openConnection();</span><br><span class="line">            connection.setRequestMethod(<span class="string">&quot;GET&quot;</span>);</span><br><span class="line">            connection.setRequestProperty(<span class="string">&quot;user-agent&quot;</span>,</span><br><span class="line">                    <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0&quot;</span>);</span><br><span class="line">            connection.connect();</span><br><span class="line">            <span class="comment">/*</span></span><br><span class="line"><span class="comment">            获取location的情况下就不需要再去返回请求的结果拉</span></span><br><span class="line"><span class="comment">            */</span></span><br><span class="line">            <span class="keyword">if</span> (ss)&#123;</span><br><span class="line">                connection.setInstanceFollowRedirects(<span class="literal">false</span>);</span><br><span class="line">                <span class="type">String</span> <span class="variable">location</span> <span class="operator">=</span> connection.getHeaderField(<span class="string">&quot;location&quot;</span>);</span><br><span class="line">                System.out.println(<span class="string">&quot;取location&quot;</span>);</span><br><span class="line">                result = location;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span> &#123;</span><br><span class="line">                System.out.println(<span class="string">&quot;不取location&quot;</span>);</span><br><span class="line">                reader = <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">InputStreamReader</span>(</span><br><span class="line">                        connection.getInputStream(), <span class="string">&quot;UTF-8&quot;</span>));</span><br><span class="line">                String line;</span><br><span class="line">                <span class="keyword">while</span> ((line = reader.readLine()) != <span class="literal">null</span>) &#123;</span><br><span class="line">                    result += line;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;<span class="keyword">finally</span>&#123;</span><br><span class="line">            <span class="keyword">if</span>(reader!=<span class="literal">null</span>)&#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    reader.close();</span><br><span class="line">                &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                    e.printStackTrace();</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        获取抖音无水印视频示例</span></span><br><span class="line"><span class="comment">        1. 先获取数字视频id</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line">        String ret;</span><br><span class="line">        <span class="type">String</span> <span class="variable">vid</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//        https://www.douyin.com/video/7123882684216085767</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;https://v.douyin.com/kKpUdTE/&quot;</span>;</span><br><span class="line">        <span class="keyword">if</span> (url.length() &lt;= <span class="number">29</span>)&#123;</span><br><span class="line">            ret = GetUrl(url, <span class="literal">true</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            ret = url;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        System.out.println(ret);</span><br><span class="line">        String regEx=<span class="string">&quot;7\\d&#123;18&#125;&quot;</span>;</span><br><span class="line">        <span class="type">Pattern</span> <span class="variable">p</span> <span class="operator">=</span> Pattern.compile(regEx);</span><br><span class="line">        <span class="type">Matcher</span> <span class="variable">m</span> <span class="operator">=</span> p.matcher(ret);</span><br><span class="line">        <span class="keyword">if</span> (m.find()) &#123;</span><br><span class="line">            vid = m.group(<span class="number">0</span>);</span><br><span class="line">            System.out.println(<span class="string">&quot;匹配到的数字视频id:&quot;</span> + vid);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;NO MATCH&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        2.把数字视频id转成字符视频id</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">/* String video_id = get_video_id(vid);</span></span><br><span class="line"><span class="comment">        System.out.println(&quot;字符视频id：&quot; + video_id);</span></span><br><span class="line"><span class="comment">        * */</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        3.获取无水印地址</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/*        String play_url = get_play(video_id);*/</span></span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">play_url</span> <span class="operator">=</span> get_play(vid);</span><br><span class="line">        System.out.println(<span class="string">&quot;无水印地址：&quot;</span> + play_url);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>旧版，此方法已失效</p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONArray;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONObject;</span><br><span class="line"><span class="keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStreamReader;</span><br><span class="line"><span class="keyword">import</span> java.net.HttpURLConnection;</span><br><span class="line"><span class="keyword">import</span> java.net.URL;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"><span class="keyword">import</span> java.util.regex.Matcher;</span><br><span class="line"><span class="keyword">import</span> java.util.regex.Pattern;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">dy_ana</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">get_video_id</span><span class="params">(String vid)</span>&#123;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        获取字符视频id</span></span><br><span class="line"><span class="comment">        * */</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=&quot;</span> + vid;</span><br><span class="line">        <span class="type">String</span> <span class="variable">ret</span> <span class="operator">=</span> GetUrl(url, <span class="literal">false</span>);</span><br><span class="line"><span class="comment">//        System.out.println(ret);</span></span><br><span class="line"></span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">obj</span> <span class="operator">=</span> JSONObject.parseObject(ret);</span><br><span class="line">        List&lt;Object&gt; Array = obj.getJSONArray(<span class="string">&quot;item_list&quot;</span>);</span><br><span class="line">        <span class="type">JSONArray</span> <span class="variable">jsonArray</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONArray</span>(Array);</span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">obj1</span> <span class="operator">=</span> jsonArray.getJSONObject(<span class="number">0</span>);</span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">obj2</span> <span class="operator">=</span> obj1.getJSONObject(<span class="string">&quot;video&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">video_id</span> <span class="operator">=</span>  obj2.getString(<span class="string">&quot;vid&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> video_id;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">get_play</span><span class="params">(String video_id)</span>&#123;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        获取无水印地址</span></span><br><span class="line"><span class="comment">        * */</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (video_id == <span class="literal">null</span>)&#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;请手动输入字符视频id&quot;</span>);</span><br><span class="line">            <span class="type">Scanner</span> <span class="variable">sc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">            video_id = sc.nextLine();</span><br><span class="line">            System.out.println(video_id);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;https://www.douyin.com/aweme/v1/play/?video_id=%s&amp;line=0&amp;is_play_url=1&amp;source=PackSourceEnum_PUBLISH&quot;</span>;</span><br><span class="line">        url = String.format(url, video_id);</span><br><span class="line">        <span class="type">String</span> <span class="variable">play_url</span> <span class="operator">=</span> GetUrl(url, <span class="literal">true</span>);</span><br><span class="line">        <span class="keyword">return</span> play_url;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">GetUrl</span><span class="params">(String url, <span class="type">boolean</span> ss)</span>&#123;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        get请求</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line">        <span class="type">BufferedReader</span> <span class="variable">reader</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">URL</span> <span class="variable">realloc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">URL</span>(url);</span><br><span class="line">            <span class="comment">//打开连接</span></span><br><span class="line">            <span class="type">HttpURLConnection</span> <span class="variable">connection</span> <span class="operator">=</span> (HttpURLConnection)realloc.openConnection();</span><br><span class="line"></span><br><span class="line">            connection.setRequestMethod(<span class="string">&quot;GET&quot;</span>);</span><br><span class="line">            connection.setRequestProperty(<span class="string">&quot;user-agent&quot;</span>,</span><br><span class="line">                    <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0&quot;</span>);</span><br><span class="line">            connection.connect();</span><br><span class="line">            <span class="comment">/*</span></span><br><span class="line"><span class="comment">            获取location的情况下就不需要再去返回请求的结果拉</span></span><br><span class="line"><span class="comment">            */</span></span><br><span class="line">            <span class="keyword">if</span> (ss == <span class="literal">true</span>)&#123;</span><br><span class="line">                connection.setInstanceFollowRedirects(<span class="literal">false</span>);</span><br><span class="line">                <span class="type">String</span> <span class="variable">location</span> <span class="operator">=</span> connection.getHeaderField(<span class="string">&quot;location&quot;</span>);</span><br><span class="line">                System.out.println(<span class="string">&quot;取location&quot;</span>);</span><br><span class="line">                result = location;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span> &#123;</span><br><span class="line">                System.out.println(<span class="string">&quot;不取location&quot;</span>);</span><br><span class="line">                reader = <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">InputStreamReader</span>(</span><br><span class="line">                        connection.getInputStream(), <span class="string">&quot;UTF-8&quot;</span>));</span><br><span class="line">                String line;</span><br><span class="line">                <span class="keyword">while</span> ((line = reader.readLine()) != <span class="literal">null</span>) &#123;</span><br><span class="line">                    result += line;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;<span class="keyword">finally</span>&#123;</span><br><span class="line">            <span class="keyword">if</span>(reader!=<span class="literal">null</span>)&#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    reader.close();</span><br><span class="line">                &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                    e.printStackTrace();</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> result;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        获取抖音无水印视频示例</span></span><br><span class="line"><span class="comment">        1. 先获取数字视频id</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line">        String ret;</span><br><span class="line">        <span class="type">String</span> <span class="variable">vid</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"><span class="comment">//        https://www.douyin.com/video/7114995682527743269</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;https://v.douyin.com/YpcJm6R/&quot;</span>;</span><br><span class="line">        <span class="keyword">if</span> (url.length() &lt;= <span class="number">29</span>)&#123;</span><br><span class="line">            ret = GetUrl(url, <span class="literal">true</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            ret = url;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        System.out.println(ret);</span><br><span class="line">        String regEx=<span class="string">&quot;7\\d&#123;18&#125;&quot;</span>;</span><br><span class="line">        <span class="type">Pattern</span> <span class="variable">p</span> <span class="operator">=</span> Pattern.compile(regEx);</span><br><span class="line">        <span class="type">Matcher</span> <span class="variable">m</span> <span class="operator">=</span> p.matcher(ret);</span><br><span class="line">        <span class="keyword">if</span> (m.find()) &#123;</span><br><span class="line">            vid = m.group(<span class="number">0</span>);</span><br><span class="line">            System.out.println(<span class="string">&quot;匹配到的数字视频id:&quot;</span> + vid);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;NO MATCH&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        2.把数字视频id转成字符视频id</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">video_id</span> <span class="operator">=</span> get_video_id(vid);</span><br><span class="line">        System.out.println(<span class="string">&quot;字符视频id：&quot;</span> + video_id);</span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        3.获取无水印地址</span></span><br><span class="line"><span class="comment">        */</span></span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">play_url</span> <span class="operator">=</span> get_play(video_id);</span><br><span class="line">        System.out.println(<span class="string">&quot;无水印地址：&quot;</span> + play_url);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="成功示例"><a href="#成功示例" class="headerlink" title="成功示例"></a>成功示例</h1><div class="img-wrap"><div class="img-bg"><img class="img" src="https://qcloud.app966.cn/img/dy_ana.png"/></div></div></li></ul><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><ul><li><font size=3>其它平台也可以按照这种方法获取无水印地址，实际原理都差不多</font></li><li><font size=3>本源码仅限学习交流，不可用于商业用途</font></li><li><font size=3>如有侵权请联系我删除</font></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;使用idea导入相关依赖&quot;&gt;&lt;a href=&quot;#使用idea导入相关依赖&quot; class=&quot;headerlink&quot; title=&quot;使用idea导入相关依赖&quot;&gt;&lt;/a&gt;使用idea导入相关依赖&lt;/h1&gt;&lt;span class=&#39;p left h3&#39;&gt;从maven导入模</summary>
      
    
    
    
    <category term="java" scheme="https://www.app966.cn/categories/java/"/>
    
    
    <category term="java" scheme="https://www.app966.cn/tags/java/"/>
    
  </entry>
  
</feed>
