本人喜欢转载一些youtube上的视频到b站上面,然后就会有些观众想要视频的封面,那我总不可能一个一个发吧,太麻烦了。故打算将资源发布到爱发电上面。但是爱发电却没有公开对应的api,只能自己动手了呀。
发布一条动态,抓包看看调用了哪些api
写代码仿照其中的参数调用api
封装起来,增加易用性
首先,发布动态长这个样子
这里我们直接发布一条动态
可以看到这个发布动态的请求地址为:http://afdian.net/api/post/publish,接下来我们看看我们的请求体是什么
可以看到这个表单挺简单的,但是有一个不太对劲的情况,就是字段"pics"的值不是我上传的地址的值("./img.jpg"),所以我猜,在调用api/post/publish接口前肯定调用了某个接口,将本地的图片转换成上图的链接,然后再拼接到上图中的字段"pics"中一起提交
在发布动态的界面直接点击上传图片
选择好图片,加载完毕之后,你就可以看见,调用了一个接口api/upload/common-pic,到这里我还没有点击发布
可以看到的确是和猜想的一样,在提交发布动态的表单前,先提交图片,获取到图片的链接之后,再拼接到发布动态的表单,进行发布
到这里我们可以知道,一个完整的发布动态流程包括两个部分
1、将本地图片转换成一个官方链接,对应api(/upload/common-pic)
2、将表单中的信息(包括上面提到的链接)进行发布,对应api(/post/publish)
首先我们初步选定了技术为python + request库
补充:代码中cookies你登陆爱发电后直接按F12,随便点几下有发送请求的按钮,然后在request中翻翻就可以看见了
我们先来看看我们需要模拟的request请求
上网搜了一下,这里大概的意思就是爱发电的这个接口需要的content-type是比较少见的类型:multipart/form-data
然后第二张图就是我这次上传的数据的数据体
参考:http://www.jianshu.com/p/902452189ca9,这个给了我大概的思路,request库对于这种类型的支持不是太好,需要借助库requests_toolbelt。然后因为我的数据是文件类型,而该博客中的是文本,所以不能直接照搬
参考:http://www.cnblogs.com/yoyoketang/p/8024039.html,http://pypi.org/project/requests-toolbelt/终于把代码写出来了
import requests
from requests_toolbelt import MultipartEncoder
# 1、初始化需要的数据,包括目标网址、请求头、cookies、图片路径等信息
url = 'http://afdian.net/api/upload/common-pic'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}
cookies = {
'auth_token': 'xxxx',
'_gid':'xxxx',
'_ga_6STWKR7T9E': 'xxxx',
'_ga': 'xxxx'
}
img_path = 'img.jpg'
# 2、使用 MultipartEncoder 创建文件上传的 payload
file_payload = {
"name":"file",
"filename":img_path,
'file':(img_path,open(img_path,'rb'))
}
m = MultipartEncoder(file_payload)
# 3、补充头
headers['Content-Type'] = m.content_type # multipart/form-data;boundary=29cf7f1b13584a73a6630a738be8274a
# 4、发送请求
response = requests.post(url, headers=headers, data = m, cookies=cookies)
# 5、输出响应内容
print(response.text)
注意:这里我开启了转义,实际上我们需要的也是转义后的数据,不过到现在我还没进行处理
值得一提的是,我还没有进行“发布”呢,返回的链接就可以直接打开了,按道理来说,可以用作图床,但是不知道爱发电会不会进行检测,类似上传了的图片在多久没进行发布就会删除。不过,还是不要用作图床了,厚道一点,毕竟爱发电
因为我们需要的是这个官方链接,所以,这里我对此进行封装成一个函数
import json
import requests
from requests_toolbelt import MultipartEncoder
# 参数:图片地址
# 返回:官方链接
def get_link(img_path):
# 1、初始化需要的数据,包括目标网址、请求头、cookies、图片路径等信息
url = 'http://afdian.net/api/upload/common-pic'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}
cookies = {
'auth_token': 'xxxx',
'_gid':'xxxx',
'_ga_6STWKR7T9E': 'xxxx',
'_ga': 'xxxx'
}
# 2、使用 MultipartEncoder 创建文件上传的 payload
file_payload = {
"name":"file",
"filename":img_path,
'file':(img_path,open(img_path,'rb'))
}
m = MultipartEncoder(file_payload)
# 3、补充头
headers['Content-Type'] = m.content_type # multipart/form-data; boundary=29cf7f1b13584a73a6630a738be8274a
# 4、发送请求
response = requests.post(url, headers=headers, data = m, cookies=cookies)
response.encoding = "unicode_escape" # 将utf-8 转换成 unicode
# 5、返回响应内容
# 5.1、将响应内容转换成json
response_json = json.loads(response.text)
# 5.2、返回想要的字段link
link = response_json['link']
return link
if __name__ == "__main__":
img_path = "img.jpg"
link = get_link(img_path)
print(link)
'''
输出:
http://pic1.afdiancdn.com/user/bc58exxxxxxx2540025c377/common/5239daxxxxxxxxxx80_h720_s117.jpg
'''
可以看到这里是json类型的数据,对应的数据字段太多,这里就不一一展示,等下在代码中你就知道了
import json
import requests
from requests_toolbelt import MultipartEncoder
# 参数:图片地址
# 返回:官方链接
def get_link(img_path):
# 1、初始化需要的数据,包括目标网址、请求头、cookies、图片路径等信息
url = 'http://afdian.net/api/upload/common-pic'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}
cookies = {
'auth_token': 'xxxx',
'_gid':'xxxx',
'_ga_6STWKR7T9E': 'xxxx',
'_ga': 'xxxx'
}
# 2、使用 MultipartEncoder 创建文件上传的 payload
file_payload = {
"name":"file",
"filename":img_path,
'file':(img_path,open(img_path,'rb'))
}
m = MultipartEncoder(file_payload)
# 3、补充头
headers['Content-Type'] = m.content_type # multipart/form-data; boundary=29cf7f1b13584a73a6630a738be8274a
# 4、发送请求
response = requests.post(url, headers=headers, data = m, cookies=cookies)
response.encoding = "unicode_escape" # 将utf-8 转换成 unicode
# 5、返回响应内容
# 5.1、将响应内容转换成json
response_json = json.loads(response.text)
# 5.2、返回想要的字段link
link = response_json['link']
return link
# 发布函数
# 传入:一个字典类型的数据,包含:标题、内容、图片链接
# 返回:响应数据
def publish(publish_data):
# 1、初始化需要的数据,包括目标网址、请求头、cookies、请求数据等信息
url = 'http://afdian.net/api/post/publish'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}
cookies = {
'auth_token': 'xxxx',
'_gid':'xxxx',
'_ga_6STWKR7T9E': 'xxxx',
'_ga': 'xxxx'
}
title = publish_data['title']
content = publish_data['content']
link = publish_data['link']
data_dict = {
"post_id":"",
"vote_id":"",
"cate":"normal",
"title":title,
"content":content,
"pics":link,
"is_public":"1",
"min_price":"0",
"audio":"",
"video":"",
"audio_thumb":"",
"video_thumb":"",
"type":"0",
"cover":"",
"group_id":"",
"is_feed":"0",
"plan_ids":"",
"album_ids":"",
"attachment":"[]",
"timing":"",
"optype":"publish",
"preview_text":""
}
# 4、发送请求
response = requests.post(url, headers=headers, data = data_dict, cookies=cookies)
# 5、返回响应内容
response.encoding = "unicode_escape" # 将utf-8 转换成 unicode
return response.text
if __name__ == "__main__":
img_path = "img.jpg"
link = get_link(img_path)
publish_data = {
"title" : "标题测试",
"content" : "内容测试",
"link" : link
}
rep = publish(publish_data)
print(rep)
http://github.com/Canwaiting/afdian-api
写完这篇博文,自己也学到了不少,这是我写的最长的一篇博客,本来是当作记录自己思路的草稿,写着写着,整理整理,就发出来了。还有很多可以优化的地方,例如每个字段,我也没搞清具体是什么回事,还有上传多张图片要怎么办等等
通过将机器人流程自动化、人工智能和机器学习之类的新兴技术结合起来,企业组织可以将自动化工作提升到一个新的水平。如果要求IT和业务主管在他们今年的优先事项清单中列出一些项目的话,那么“增加更多的自动化”肯定位列其中。在新冠疫情大流行期间,自动化流程已经变得越发重要,因为它不仅能够更快、更准确地完成任务,同时还可以降低成本。机器人流程自动化(RPA)、人工智能(AI)、机器学习(ML)等技术在许多致力实现其自动化目标的企业中正受到越来越多的关注。结合这些工具以帮助组织创建更广泛的自动化功能的新兴概念——“超自动化”(hyperautomation),可能最终将成为今年最重要的技术趋势之一。什么是超自动化(hyperautomation)?该术语是由研究机构Gartner创造的,该公司将超自动化定义为“先进的人工智能和机器学习技术的应用,以逐步实现流程自动化和增强人类能力。”该公司表示,超自动化技术涵盖了一系列可以实现自动化的工具,但同时它也指明了自动化的复杂性。该公司在2020年12月发布的一份关于超自动化的调查报告中指出,“业务驱动的超自动化是一种非常严格的方法,组织可以使用它来快速识别
1推荐系统基础知识从常用概念展开,简要介绍基本原理和流程,以便业务方了解如何构建和使用推荐系统2基本概念2.1推荐系统通过将内容(生产方)与用户(消费方)进行匹配,提供符合不同消费方各自偏好的内容,在不同业务方的知识体系中可能会被称为:智能分发,个性化推荐,千人千面2.2内容平台或用户所生产出的成果,可以为文章,视频,课程,商品等2.3用户对内容进行消费的对象,可以为普通用户,商业客户,第三方服务等2.4行为用户对内容产生的操作,如点击,收藏,购买,分享等,通过日志记录存储后,用于建立内容与用户的关联2.5标签通过人工或机器的方法,对内容和用户添加特征,用来标识其特有属性,可从内容本身中发现,也可从用户行为中体现,也可由用户自行填写,如用户性别,内容长度,内容分类等2.6适用场景什么时候引入推荐系统:当内容和用户积累达到一定量级(内容至少千级),且内容分布达到一定宽度,可分离出不同维度,进而产生了用户对内容的偏好性,需要对内容进行合理高效的分发以充分利用流量,并开始要求高并发高实时的性能时,可以开始考虑使用推荐系统3实现依赖仅简要阐述实现推荐系统所需的功能组件,是基本概念的具象化3.1
PHP是网络上最流行的编程语言之一,许多被广泛使用的内容管理系统都使用它开发,如WordPress和Drupal,并为现代服务器端框架(如Laravel和Symfony)提供核心代码。尽管PHP很受欢迎,但是其缓慢和难以维护也是众所周知的。近几年这两个毛病已经没有那么严重了,但是高性能的PHP应用程序依然会需要两个功能:OPcache和PHPFastCGI进程管理器(PHP-FPM)。在本文中,你将了解到在Kubernetes上如何使用自定义OPcache和PHP-FPM配置部署一个PHP应用程序以提高其性能。你将使用Rancher来部署一个PHP应用程序,该应用程序使用自定义环境变量来动态配置OPcache和PHP-FPM。我们将展示如何在你的Docker镜像中构建PHP-FPM配置选项并在容器中使用环境变量调整它们。在PHP中的性能首先,了解PHP应用程序中如何处理网络请求将对本文接下来的内容很有帮助。PHP通常运行在web服务器旁边,处理请求并将它们发送到PHP应用程序中。你可以使用PHP-FPM或mod_PHP来运行你的应用程序,但在本文中我们将使用PHP-FPM,因为其性能优
饿汉式packagecom.ph.single; //饿汉式单例模式 publicclassHungry{ //可能会浪费空间,开辟了空间,却没有使用 privateHungry(){ } privatefinalstaticHungryHUNGRY=newHungry(); publicstaticHungrygetInstance(){ returnHUNGRY; } }复制懒汉式存在多线程并发模式,后面的DCL懒汉式解决并发问题packagecom.ph.single; publicclassLazyMan{ privateLazyMan(){ System.out.println(Thread.currentThread().getName()+"OK"); } privatestaticLazyManlazyMan; //双重检测锁模式的懒汉式单例DCL懒汉式 publicstaticLazyMangetInstance(){ if(lazyMan==null){ lazyMan=newLazyMan();//不是一个原子性操作 } ret
在Android开发,图片是很常用的,用户头像基本上都是圆形的,我们可以自己写画布类,将其变为圆形的,但是比较麻烦获取bitmap体验也不好,在这里使用开源框架roundedimageview。1.首先在build.gradle中添加:compile'com.makeramen:roundedimageview:2.3.0'复制2.在布局中:<com.makeramen.roundedimageview.RoundedImageView android:id="@+id/xquserimage" app:riv_oval="true" android:layout_gravity="center" android:layout_width="50dp" android:layout_height="50dp" android:src="@drawable/weidenglu"/>复制3.其余使用与imageview类似。
AI科技评论消息,用于在TensorFlow中构建并行强化学习算法的高效基础架构范例TensorFlowAgents日前开源,这个项目是由谷歌的两位研究员JamesDavidson、VincentVanhoucke,以及DanijarHafner共同研发的。关于这个项目的开源信息他们在GitHub上进行了介绍,AI科技评论将内容进行编译整理。TensorFlowAgentsTensorFlowAgents为强化学习提供了优化的基础架构,它将OpenAIgym接口扩展到多个并行环境,并能在TensorFlow中训练智能体,进行批量计算。在这个项目中,我们提供BatchPPO,这是针对近端策略优化(ProximalPolicyOptimization,PPO)的一个实现。如果你在研究中使用了我们这个项目的代码,请引用我们之前发布的关于TensorFlowAgents的论文TensorFlowAgents:EfficientBatchedReinforcementLearninginTensorFlow,论文地址:https://drive.google.com/file/d/0B20Yn-
作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/35 本文地址:https://www.showmeai.tech/article-detail/222 声明:版权所有,转载请联系平台与作者并注明出处 收藏ShowMeAI查看更多精彩内容 本系列为吴恩达老师《深度学习专项课程(DeepLearningSpecialization)》学习与总结整理所得,对应的课程视频可以在这里查看。 引言 在ShowMeAI前一篇文章卷积神经网络解读中我们对以下内容进行了介绍: 卷积计算、填充 卷积神经网络单层结构 池化层结构 卷积神经网络典型结构 CNN特点与优势 本篇内容ShowMeAI展开介绍和总结几个有名的典型CNN案例。这些CNN是最典型和有效的结构,吴恩达老师希望通过对具体CNN模型案例的分析讲解,帮助我们理解CNN并训练实际的模型。 本篇涉及到的经典CNN模型包括: LeNet-5 AlexNet VGG ResNet(ResidualNetwork,残差网络) InceptionNeuralNetwork
Java给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径。 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。 这里定义和线程相关的另一个术语-进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守候线程都结束运行后才能结束。 多线程能满足程序员编写高效率的程序来达到充分利用CPU的目的。 1.多线程基础概念介绍 进程是程序(任务)的执行过程,它持有资源(共享内存,共享文件)和线程。 分析: ① 执行过程是动态性的,你放在电脑磁盘上的某个eclipse或者QQ文件并不是我们的进程,只有当你双击运行可执行文件,使eclipse或者QQ运行之后,这才称为进程。它是一个执行过程,是一个动态的概念。 ② 它持有资源(共享内存,共享文件)和线程:我们说进程是资源的载体,也是线程的载体。这里的资源可以理解为内存。我们
引言 前面Android开发之旅:环境搭建及HelloWorld,我们介绍了如何搭建Android开发环境及简单地建立一个HelloWorld项目,本篇将通过HelloWorld项目来介绍Android项目的目录结构。本文的主要主题如下: 1、HelloWorld项目的目录结构 1.1、src文件夹 1.2、gen文件夹 1.3、Android2.1文件夹 1.4、assets 1.5、res文件夹 1.6、AndroidManifest.xml 1.7、default.properties 1、HelloWorld项目的目录结构 (这个HelloWorld项目是基于Android2.1的)在Eclipse的左侧展开HelloWorld项目,可以看到如下图的目录结构: 图1、HelloWorld项目目录结构 下面将分节介绍上面的各级目录结构。 1.1、src文件夹 顾名思义(src,sourcecode)该文件夹是放项目的源代码的。打开HelloWorld.java文件会看到如下代码: packagehelloworld.test; importandroid
目录CSAPPLab2结果HintsPhase1答案汇编Phase2答案汇编Phase3答案汇编Phase4答案汇编Phase5答案汇编Phase6答案汇编SecretPhase答案secret_phase汇编fun7汇编phase_defused汇编总结 CSAPPLab2 人要没了。 计算机也太令人头秃了 不过好好做一整天也就弄完了(雾) 博客园的标题链接也太蠢了,同样标题名称就只能通过目录跳转到第一个标题位置,这样的实现也不难吧 https://www.zybuluo.com/SovietPower/note/1786675 参考: https://zhuanlan.zhihu.com/p/339461318 https://zhuanlan.zhihu.com/p/339575162 结果 phase_3的其它一种答案: phase_4的其它两种答案: phase_5的其它两种答案: Hints (其实也没什么用) 运行前先可在phase_1...等函数处设断点:breakphase_1,以便查看值。也可以breakexplode_bomb以便在bomb
看到有人问如何输出如下格式的字符: //16101315//271114//3812//49//5 于是写了一个,以后方便查看。 1main() 2{ 3/*rowsijt 4 5106 5 110 6 213 7 315 8 9 207 10 111 12*/ 13 14introws; 15 16while(1) 17{ 18scanf("%d",&rows); 19 20if(rows==0) 21break; 22 23for(inti=1;i<=rows;i++) 24{ 25printf("%d\t",i); 26intt; 27for(intj=0;j<rows-i;j++) 28{ 29if(j==0) 30{ 31t=rows+i; 32} 33else 34{ 35t+=rows-j; 36} 37 38printf("%d\t",t); 39} 40putchar('\n'); 41} 42 43} 44return0; 45}复制 http://lison.cc
1.kindsofoperation Ingeneral,thereareseveralkindsoffileoperationsasbellow. (1) Createfile/folder,Openfile, Closefile,Removefile/folder, path packagemain import( "log" "os" ) funcmain(){ //getcurrentdir file,_:=os.Getwd() log.Println("currentpath:",file) //changedir os.Chdir("d:\\") file,_=os.Getwd() log.Println("currentpath:",file) //createfilewithrelativepath f,err:=os.Create("bada.dat") iferr!=nil{ log.Fatalln(err.Error()) } log.Println("createfile:",f.Name())
比赛链接 通过顺序:\(B\rightarrowD\rightarrowI\rightarrowJ\rightarrowG\rightarrowH\rightarrowA\rightarrowK\rightarrowC\rightarrowE\rightarrowL\rightarrowF\) A蹄球锦标赛: 给你\(N\)个点\(N\)条有向边,求在某些点开始跑边能够遍历整张图的最少点数 这已经是简化版的题意了,略去了前面没必要讲的建边(因为对于一个能看懂并写出AC代码的大佬来说这不是啥问题),建边唯一的坑点就是任意一头牛的左右两头牛距离相同连向左边(原题面括号那一句写错了)。 具体讲后面的操作: 如果一个点\(x\)连向\(y\)一条有向边,那么显然放在\(x\)比放在\(y\)更优,因为放\(x\)一定到\(y\),放\(y\)不一定能到\(x\)。 我们不妨做出一个假设:只有没有有向边连到的点是需要放球的 这已经非常接近正解了,但是很可惜,少考虑了一种情况 我们考虑这组数据 4 1314 复制 这样子相当于构造出了两个大小为二的环(事实上本题最大环大小就是二,但这不是重点,所以
超时提交版本 备注:须在当前文件夹提供抽奖.txt 组员职责分工(5分) GUI编写 淇、跃安 后台编写 淇、佳炜 算法探索 泓、松、杰 专业辅助(打杂) 裕翔、杰 github的提交日志截图(鼓励小粒度提交)(3分) 程序运行截图(5分) 程序运行环境(方便助教进行测试。如果是web服务最好了,如果是桌面程序,建议使用GitHub的"Releases"发布程序包,参考这里,不要出现“在我这里能正常运行啊”的情况。如果助教不能运行,仅靠程序运行截图,以下得分再减50%) Windows10(C#) GUI界面(10分) 基础功能实现(35分) 实现完整GUI界面 设置抽奖事件、文案、规则 设置参与抽奖关键词,所有发某个关键词的用户可参与 抽奖活动文案 抽奖发言时段 抽奖过滤规则 抽奖结果公布倒计时 抽奖人数 奖品列表 获奖名单 导出抽奖结果(抽奖话题、中奖人员、对应奖项) 抽奖算法: 抽奖当时获取系统时间取秒数,以及获取随机数,加入到计算中,通过随机分支至多种不同数学公式进行混淆从而使结果随机性与不可预测性增大,最后取
1.如果系统中未安装依赖fcitx,libssh2-1,或者依赖fcitx,libssh2-1的版本低的话,则需提前安装或者升级,否则安装输入法时会出错安装命令sudoapt-getinstallfcitxlibssh2-1查看是否安装了这些依赖搜索命令dpkg-l|grepfcitxdpkg-l|greplibssh2.接下来我们从搜狗官方下载deb包下载地址在 http://pinyin.sogou.com/linux/ 根据你的系统选择32位或者64位也可直接使用命令:下载32位wget"http://pinyin.sogou.com/linux/download.php?f=linux&bit=32"-O"sougou_32.deb"下载64位wget"http://pinyin.sogou.com/linux/download.php?f=linux&bit=64"-O"sougou_64.deb"3.安装下载好的安装包命令sudodpkg-isougou_64.deb这里的sougou_64.deb是上一步下载的安装包文件名,根据你自己上
【问题描述】 拼图达人小C手里有n个1*1的正方形方块,他希望把这些方 块拼在一起,使得拼出的图形周长最小,要求方块不能重叠。擅长拼 图的小C一下就求出了这个周长,顺便他想考考你会不会求。 【输入格式】 多组数据,第一行一个正整数T,表示数据组数。 接下来T行,每行一个正整数n,表示方块数。 【输出格式】 输出T行,每行一个正整数,表示答案。 【样例输入】 3 4 11 22 【样例输出】 8 14 20 【数据范围】 对于20%的数据,n<=20; 对于40%的数据,n<=1000; 对于60%的数据,n<=10^6; 对于80%的数据,n<=10^10; 对于100%的数据,n<=10^12,T<=10。 【题解】 很显然,拼出来的东西轮廓线可以变换为一个长方形 正解是拼成正方形,再把剩下的补在周围,乱搞一下就好了。 可是这样很容易写挂 于是,可以暴力的从√n往大和往小搜一个范围枚举长方形一条边长,然后取个最小值就好了 【代码】 #include<algorithm> #include<iostream> #includ