facebook是美国的一个社交网络服务网站,至今注册用户已超越20亿,月活用户更是惊人的突破3亿。
这样庞大的一个社交类网站,每日产生的社交数据当然也是非常可观,而这些社交数据,更接近口语,所以是比较好的一些英文语料数据。
然而,面对这样好的一个语料来源,它的下载难度也是超越了我的预期。
起初,因为使用facebook需要fq的原因,我们放弃了从app端解析数据的方式。
因为这种方式需要手机app端和电脑连接在同一个网络下,并且手机端需要设置代理为电脑ip。然而经过测试,这样设置以后手机端不能正常fq,这个问题有待进一步解决。
除了app端,这边便打算通过网页端直接去获取数据。
分析发现,通过 facebook /profile.php?id=5这种形式的链接可以直接跳转到用户的8797威尼斯老品牌主页, facebook /chrishughes
8797威尼斯老品牌主页下面有以下信息
?
点击左边框内的链接,可以获得以下语料数据,右边框内则是该用户的一些关联用户。
这样一来,我们便有了第一个版本的下载策略。
通过遍历用户id的方式,访问到用户的8797威尼斯老品牌主页下,然后根据用户的一些关联信息获取一些名人和营销帐号下的帖子信息以及该用户关联的用户信息。
这样一来,就能形成一个循环下载,循环中我们能够不断的扩充自己的facebook用户数据和帖子数据。
于是,通过这种方式,我们编写好了初步的下载程序,实际一下载,傻眼了。
facebook会封ip,就是出现验证码来需要输入,类似以下这样的:
显然,这样的验证码,我们这边暂时还解决不了。
既然解决不了验证码,那只能选择放弃被封ip,启用新的ip方法。
这边估算是平均一个ip只能下载1mb左右的语料数据,然后就会被封,这样一来,如果需要每天下载1g数据的话就需要1000多个ip。
虽然目前我们这边有代理ip库,但因为是免费的,所以稳定性和可用性都还是比较差的。
再加上facebook需要fq的缘故,经过测试,实际可用的代理ip只有不到5个,显然,这样肯定行不通。
经过讨论,这边想通过使用付费代理的方式来提高ip的可用性,想着付费的ip应该会好很多把。
然后,经过两天的查找,得到的回答几乎是一样的,能够fq的ip是没有的。
好奇,自己这边使用的免费收集的代理都有能用的,收费的怎么会没有呢。
经过考虑,认为国外的ip应该是可以实现fq的,但是估计实际的fq可用率不太高。
于是这边购买了一些网站的代理ip来实际测试,发现果然如此,实际的可用率比我们这边的免费代理高的不多,也就维持在10个左右,但是稳定性确实比我们的高。
这样一来,每天的下载速度也就10mb左右,这样肯定是不行的。
(备注:这里发现并不是贵的代理质量就比较好,测试发现 66ip /和 daxiangdaili /这两家还是比较好用的,也比较便宜。当然这边测试的是能够用来fq的ip,可能具体使用时需要具体分析把)
通过网页直接获取数据的方式行不通,因此,这种方式只能选择放弃。
因此,现在只剩下最后一种方式,通过facebook官方提供的api来获取。
这种方式其实之前也尝试过,但是发现api需要一些用户信息,而且只能看关注的用户信息,所以当时就没有继续深究下去。
但是现在一想,比起其他的方式一天只能获取10mb左右的数据,api的方式肯定会多一点(因为实在是没什么别的办法了)。
花了一天时间,好好的看了一下facebook的api, developers.facebook /docs/graph-api/reference/
找到了一些可用的api接口:
graph.facebook /v2.9/{用户id}/feed?access_token={开发者access_token} ? 获取用户发的帖子,通过此接口得到语料数据
graph.facebook /v2.9/{用户id}/likes?access_token={开发者access_token} ??获取用户感兴趣的人,通过此接口得到关联用户
graph.facebook /v2.9/{用户id}/comments?access_token={开发者access_token} ? 获取用户帖子的评论,通过此接口得到具体某一个帖子的评论,也就是语料数据
想到的下载策略是:先找一个用户,然后通过关联用户接口获取第一批用户,再通过用户id循环获取用户的帖子和关联的用户即可实现下载。
因此这里的重点就是开发者access_token,这个可以通过注册开发者来获取,因此这里就不在赘述了。
以上,就是此次facebook下载的一些总结和记录。
转载于: www blogs /niansi/p/7107455.html
youtube、facebook、insgram三平台数据获取方式之前篇
? 本篇文章主要介绍项目背景和最终实现效果,每个平台具体的操作方式请自行选择观看。 提前说明:每个平台仅获取视频相关信息并不涉及下载相关,请选择阅读。其中,youtube使用官方api操作完成,facebook及ins使用爬虫调用接口完成。
2020-06-04 更新 现已更新代码到github,具体细节请参考具体文章中的介绍 github地址
项目背景介绍
? 最近在做一个资讯类app,在某版本中的一个需求中想要达到如下效果:
输入一个频道的url可以获取其下所有历史视频记录(如下举例) 。 youtube : youtube /channel/ucxcuxsajdnqairwyb5cvisw) facebook : facebook /watch/trizkiananda/ insgram : instagram /mobil1/ 输入一个视频的url可以获取其视频信息。 根据已经输入的频道地址,每日获取其最近更新的视频(订阅功能)。 根据获取到的视频信息、视频地址在系统内播放。
? 以上的要求作用于youtube、facebook、insgram三个平台之上。
基于这些需求,需要实现这三个平台的爬虫程序。由于在本项目中并不需要实际将视频下载下来,只需要获取视频的信息(如:标题、分类、作者信息、简介、标签、上传时间等等,用于业务上的使用)和视频链接(使用iframe包装实现在自己的页面里实现引用)。
效果展示
页面展示效果
链接引用格式
具体每个平台的iframe引用格式后续单平台中都会给出。
管理后台相关
频道管理
播放列表管理
视频管理
相关文章跳转:
youtube数据获取
facebook数据获取
ins数据获取
各平台使用到的参数参考
youtube
{
"kind": "youtube#video",
"etag": etag,
"id": string,
"snippet": {
"publishedat": datetime,
"channelid": string,
"title": string,
"description": string,
"thumbnails": {
(key): {
"url": string,
"width": unsigned integer,
"height": unsigned integer
}
},
"channeltitle": string,
"tags": [
string
],
"categoryid": string,
"livebroadcastcontent": string,
"defaultlanguage": string,
"localized": {
"title": string,
"description": string
},
"defaultaudiolanguage": string
},
"contentdetails": {
"duration": string,
"dimension": string,
"definition": string,
"caption": string,
"licensedcontent": boolean,
"regionrestriction": {
"allowed": [
string
],
"blocked": [
string
]
},
"contentrating": {
"acbrating": string,
"agcomrating": string,
"anatelrating": string,
"bbfcrating": string,
"bfvcrating": string,
"bmukkrating": string,
"catvrating": string,
"catvfrrating": string,
"cbfcrating": string,
"cccrating": string,
"ccerating": string,
"chfilmrating": string,
"chvrsrating": string,
"cicfrating": string,
"cnarating": string,
"cncrating": string,
"csarating": string,
"cscfrating": string,
"czfilmrating": string,
"djctqrating": string,
"djctqratingreasons": [,
string
],
"ecbmctrating": string,
"eefilmrating": string,
"egfilmrating": string,
"eirinrating": string,
"fcbmrating": string,
"fcorating": string,
"fmocrating": string,
"fpbrating": string,
"fpbratingreasons": [,
string
],
"fskrating": string,
"grfilmrating": string,
"icaarating": string,
"ifcorating": string,
"ilfilmrating": string,
"incaarating": string,
"kfcbrating": string,
"kijkwijzerrating": string,
"kmrbrating": string,
"lsfrating": string,
"mccaarating": string,
"mccyprating": string,
"mcstrating": string,
"mdarating": string,
"medietilsynetrating": string,
"mekurating": string,
"mibacrating": string,
"mocrating": string,
"moctwrating": string,
"mpaarating": string,
"mpaatrating": string,
"mtrcbrating": string,
"nbcrating": string,
"nbcplrating": string,
"nfrcrating": string,
"nfvcbrating": string,
"nkclvrating": string,
"oflcrating": string,
"pefilmrating": string,
"rcnofrating": string,
"resorteviolenciarating": string,
"rtcrating": string,
"rterating": string,
"russiarating": string,
"skfilmrating": string,
"smaisrating": string,
"smsarating": string,
"tvpgrating": string,
"ytrating": string
},
"projection": string,
"hascustomthumbnail": boolean
},
"status": {
"uploadstatus": string,
"failurereason": string,
"rejectionreason": string,
"privacystatus": string,
"publishat": datetime,
"license": string,
"embeddable": boolean,
"publicstatsviewable": boolean,
"madeforkids": boolean,
"selfdeclaredmadeforkids": boolean
},
"statistics": {
"viewcount": unsigned long,
"likecount": unsigned long,
"dislikecount": unsigned long,
"favoritecount": unsigned long,
"commentcount": unsigned long
},
"player": {
"embedhtml": string,
"embedheight": long,
"embedwidth": long
},
"topicdetails": {
"topicids": [
string
],
"relevanttopicids": [
string
],
"topiccategories": [
string
]
},
"recordingdetails": {
"recordingdate": datetime
},
"filedetails": {
"filename": string,
"filesize": unsigned long,
"filetype": string,
"container": string,
"videostreams": [
{
"widthpixels": unsigned integer,
"heightpixels": unsigned integer,
"frameratefps": double,
"aspectratio": double,
"codec": string,
"bitratebps": unsigned long,
"rotation": string,
"vendor": string
}
],
"audiostreams": [
{
"channelcount": unsigned integer,
"codec": string,
"bitratebps": unsigned long,
"vendor": string
}
],
"durationms": unsigned long,
"bitratebps": unsigned long,
"creationtime": string
},
"processingdetails": {
"processingstatus": string,
"processingprogress": {
"partstotal": unsigned long,
"partsprocessed": unsigned long,
"timeleftms": unsigned long
},
"processingfailurereason": string,
"filedetailsavailability": string,
"processingissuesavailability": string,
"tagsuggestionsavailability": string,
"editorsuggestionsavailability": string,
"thumbnailsavailability": string
},
"suggestions": {
"processingerrors": [
string
],
"processingwarnings": [
string
],
"processinghints": [
string
],
"tagsuggestions": [
{
"tag": string,
"categoryrestricts": [
string
]
}
],
"editorsuggestions": [
string
]
},
"livestreamingdetails": {
"actualstarttime": datetime,
"actualendtime": datetime,
"scheduledstarttime": datetime,
"scheduledendtime": datetime,
"concurrentviewers": unsigned long,
"activelivechatid": string
},
"localizations": {
(key): {
"title": string,
"description": string
}
}
}
{
"node": {
"feed_unit": {
"__typename": "story",
"encrypted_tracking": "azxee5o8968hcdtd45bkr8_bec9tax3zqsk_kjirjhmw1w42c3iusdie80jbwrfb3sgxrw8a6nf3pexar3a-blw9jt2jnibm4or3gyb_xeecf0nmmr8bbclxqbnzpfu7pi0tpewhg3a6_xxd0-fokageakmo4ucxhw5rh3dvau--bnn11s2nppyxwcuw6hns54qixvpwuc2by_5gjh-pz_3t30exxdgnzqubdvheltiamhfs1kws89-lo3jrzohu3mjeeawy6cmmxisdhemiyfcpr3eeeluodmeahvzhxgwo8g5khn735uvzhvlbfgmyujglj5oopqvswqdjthgzabe4yx5oeizlcn-58jztwcdkljmwoii3dbxc57c_olobpwm2fnirn_fkfcb6eadk5jthwuk9cgbxcxlhdmnefibyisu5q8h8v04pv9b7mf40xugjurysfda95r_cmbs7ngibh7ya2rsry_fcwfm9ffydhzckwxngeykhzd6tvp1t_v60b3jo7meowpy8n0voprttpjnkn9qdijjshj69cizy5uxwv4bojo2hkfsn5w7ebabry6l7t5o9k4zdvppzci-dnovofky4ydhnvzir64b2e6orkdjkded9nqwngzn-ylni95bdyrjfmvacmzpkuh5klacjqcvh5rkkdp_48bji6mzqj5howgdkn1zpt5czv72nzaovcljysdxw9zca2ylk1ofgsl64zyjybgk_s6b_wlbbrkxc4memk4f20chvqffliteryc-ahpgurc49owfwf-6bz_kzaavnibeymimfmfsb7rewm0mamcmlp8oeu5bhzkivabzrf1u3cdtctnzxx47e1n4vf50cpmmfunvihjb0omxorgbwwksc0w09vmcoqtpxfnifejquutixd2dyfpmrvxuw9gu06eqja2yw1mhvdutkeqzmj8rcbl0j32gnb-0lesrfzpcmatawxf0safg_khypvbk-rip_wtk5iasskdeynawxs_dfahlhu6j4fgj3luk448u3lazuoxxv",
"viewability_config": [
8,
5
],
"attachments": [
{
"media": {
"__typename": "video",
"publish_time": 1532093178,
"container_story": null,
"play_count": 32,
"total_posts": 1,
"post_play_count": 32,
"feedback": {
"id": "zmvlzgjhy2s6mjq5mdaxnjkymzy3otyz",
"top_reactions": {
"edges": [
{
"i18n_reaction_count": "13",
"node": {
"localized_name": "\u3044\u3044\u306d\uff01",
"reaction_type": "like",
"id": "1635855486666999"
}
}
]
},
"i18n_reaction_count": "13",
"important_reactors": {
"nodes": [
]
},
"reaction_count": {
"count": 13
},
"viewer_actor": null,
"viewer_feedback_reaction_info": null
},
"id": "249001692367963",
"image": {
"uri": " scontent-nrt1-1.xx.fbcdn /v/t15.5256-10/s640x640/36024470_249002852367847_4933958855123009536_n.jpg?_nc_cat=104&_nc_ohc=yntphtxuiwwax8l-v6i&_nc_ht=scontent-nrt1-1.xx&oh=0c115c662b07613f4994c37ac8307cb3&oe=5e8e3423"
},
"has_viewer_watched_show_video": false,
"is_live_streaming": false,
"url": " facebook /jimsko07/videos/249001692367963/",
"video_channel": {
"__typename": "virtualvideoschannel",
"id": "dmlkzw9dagfubmvsojm4nzqznzg4odewnjmwmtoyndkwmde2otiznjc5njm="
},
"owner": {
"__typename": "page",
"id": "210402066227926",
"name": "racing jaya"
},
"is_show_video": false,
"playable_duration_in_ms": 58942,
"viewer_last_play_position_ms": null,
"broadcast_status": null,
"smart_preview_video": {
"id": "249003012367831",
"original_width": 400,
"original_height": 224,
"broadcaster_origin": null,
"broadcast_status": null,
"is_live_streaming": false,
"is_looping": true,
"loop_count": 23,
"is_spherical": false,
"permalink_url": " facebook /jimsko07/videos/249003012367831/",
"captions_url": null,
"dash_prefetch_experimental": [
"478219935963026v"
],
"can_use_oz": true,
"playable_url_dash": " facebook /video/playback/dash_mpd_debug.mpd?v=249003012367831&dummy=.mpd",
"dash_manifest": "\u003c?xml version=\"1.0\"?>\n\u003cmpd xmlns=\"urn:mpeg:dash:schema:mpd:2011\" minbuffertime=\"pt1.500s\" type=\"static\" mediapresentationduration=\"pt0h0m4.000s\" maxsegmentduration=\"pt0h0m2.000s\" profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011, dashif.org/guidelines/dash264\">\u003cperiod duration=\"pt0h0m4.000s\">\u003cadaptationset segmentalignment=\"true\" maxwidth=\"400\" maxheight=\"224\" maxframerate=\"30\" par=\"400:224\" lang=\"und\" subsegmentalignment=\"true\" subsegmentstartswithsap=\"1\">\u003crepresentation id=\"478219935963026v\" mimetype=\"video/mp4\" codecs=\"avc1.64000d\" width=\"400\" height=\"224\" framerate=\"30\" sar=\"1:1\" startwithsap=\"1\" bandwidth=\"364906\" fbencodingtag=\"dash_v4_passthrough_frag_2_video\" fbplaybackresolutionmos=\"0:100,225:100,360:100,480:100,720:100,1080:100\" fbplaybackresolutionmosconfidencelevel=\"high_passthrough\" fbabrpolicytags=\"\" fbdefaultquality=\"1\" fbqualityclass=\"sd\" fbqualitylabel=\"source\">\u003cbaseurl> video-nrt1-1.xx.fbcdn /v/t42.1790-2/37319888_478219949296358_8491347577680166912_n.mp4?_nc_cat=110&efg=eyj2zw5jb2rlx3rhzyi6imrhc2hfdjrfcgfzc3rocm91z2hfznjhz18yx3zpzgvvin0\u00253d&_nc_ohc=tcb7tpakhycax_fjeoq&_nc_ht=video-nrt1-1.xx&oh=0de47837c4b2e6078ca5c79d64c9081c&oe=5e3c183e\u003c/baseurl>\u003csegmentbase indexrangeexact=\"true\" indexrange=\"912-967\" fbfirstsegmentrange=\"968-79460\">\u003cinitialization range=\"0-911\"/>\u003c/segmentbase>\u003c/representation>\u003c/adaptationset>\u003c/period>\u003c/mpd>\n",
"min_quality_preference": null,
"playable_url": " video-nrt1-1.xx.fbcdn /v/t42.9040-2/37336605_1918152674896299_3659291460219437056_n.mp4?_nc_cat=102&efg=eyjybhiiojq4miwicmxhijo1mtisinzlbmnvzgvfdgfnijoic3zlx3nkin0\u00253d&_nc_ohc=7d0azlxhnq0ax_vzina&rl=482&vabr=268&_nc_ht=video-nrt1-1.xx&oh=5af3084da685165f2e262235a381d20d&oe=5e3c13bc",
"playable_url_quality_hd": null,
"autoplay_gating_result": "gatekeeper",
"viewer_autoplay_setting": "default_autoplay",
"can_autoplay": false,
"drm_info": "{\"drm_helper\":null,\"video_license_uri_map\":{},\"graph_api_video_license_uri\":null,\"widevine_cert\":\"cseccamsebcfurfmegsgiwyzoi93kowygrsckguijgiwggekaoibaqcz7vs7mn2rxitvw7yqlbwyugrvvms3ud4grbgu2ha430brbegtjootsru4je5ywl5kngevkr1yweajp gvdjipenk5mahhc28vjiemfig\\/ \\/7qd ebnh5xgeikx0ymprtmdobyqgb63obprirxsteo1nzn6znwxzg6ifto7l1kemphsqykfqpdq4iy3brxyt4zkve9b\\/tkqv0x4b9asmye0cs6tjugpl x7r1gkpr87vvbuvvk4tdnbnffxhoggrmwegudwe3ojhbwgmgnb2fg2cxkxfmtrjcntuw3r0svaqxz6chd4lgvc2ufxbd8xm7fzpvtclrxg88suagcn1ojagmbaae6fgxpy2vuc2uud2lkzxzpbmuuy29teoadrjrzflwonsl\\/jxoi 3u4y1j30kmcpn3r2jc5mzlrhrpmveoeuus5j8ehng79verj1borfm7bdqeeoeykudvblsubpotod8s\\/wgqyckqvs\\/zrnb3pzfv0zkwo0bqqqwz53ogemby9sztk\\/nducxhcomquvge98k\\/plspkkknyveqrona 8xz\\/apvtbwv4k drvwy6t95z0qvmdv62qke4xemfvkuizryz\\/daxlup8qcu9u\\/r6dhpv51wjx7zmvflkb1gquc9wqgi5efhn9jolk3\\/bnixbxozvvdhbyqnfk8odyffunaq3fkc3hr3f0kmygi41sljnxxjqwmow9wrzbmink 3k6p8cbxfmjd4\\/paj8fwmhdsrfuoi6jj8m76h3ctszczkdjjm3bqq6kb2m bq0lmjfvdyxorgvff\\/\\/m\\/eekprkwyu2c3ybxpxabquo4c8a0ujvmgeeqsxn1hx9lu6c5omm8hudxwwfd7ohms3avgpr7rp7duntikxrh6x0\"}",
"captions_settings": null
},
"playable_duration": 59,
"live_viewer_count_read_only": 0,
"breaking_status": false,
"is_premiere": false,
"is_subscribed_to_live_video_schedule": false,
"broadcast_schedule": null,
"name": "",
"savable_description": {
"text": "",
"image_ranges": [
],
"inline_style_ranges": [
],
"aggregated_ranges": [
],
"ranges": [
]
},
"playlist_video_channel": {
"__typename": "page",
"id": "210402066227926"
},
"video_view_model": {
"episode_number": null
},
"sotto_content": null
}
}
],
"attached_story": null,
"id": "uzpfstixmdqwmja2njiynzkynjpwszoyndkwmde2otiznjc5njm="
},
"__typename": "videohomefeedunitsectioncomponent"
},
"cursor": null
}
insgram
{
"node":{
"__typename":"graphvideo",
"id":"2170031570784940044",
"dimensions":{
"height":937,
"width":750
},
"display_url":" scontent-nrt1-1.cdninstagram /v/t51.2885-15/e35/70288458_2432643487003298_7115159233566819988_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=102&_nc_ohc=rkkgrmnh-okax8f6tbb&oh=7e53cbcd0d6a33827a95cb8007c8dc77&oe=5e474d82",
"display_resources":[
{
"src":" scontent-nrt1-1.cdninstagram /v/t51.2885-15/sh0.08/e35/p640x640/70288458_2432643487003298_7115159233566819988_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=102&_nc_ohc=rkkgrmnh-okax8f6tbb&oh=72313d4c22e9505298ae425b30132c6e&oe=5e47a728",
"config_width":640,
"config_height":800
},
{
"src":" scontent-nrt1-1.cdninstagram /v/t51.2885-15/e35/70288458_2432643487003298_7115159233566819988_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=102&_nc_ohc=rkkgrmnh-okax8f6tbb&oh=7e53cbcd0d6a33827a95cb8007c8dc77&oe=5e474d82",
"config_width":750,
"config_height":937
},
{
"src":" scontent-nrt1-1.cdninstagram /v/t51.2885-15/e35/70288458_2432643487003298_7115159233566819988_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=102&_nc_ohc=rkkgrmnh-okax8f6tbb&oh=7e53cbcd0d6a33827a95cb8007c8dc77&oe=5e474d82",
"config_width":1080,
"config_height":1350
}
],
"is_video":true,
"tracking_token":"eyj2zxjzaw9uijo1lcjwyxlsb2fkijp7imlzx2fuywx5dgljc190cmfja2vkijp0cnvllcj1dwlkijoizddjyzbiztcxnjiyndyzmtkzngqzzteyywnlnji5zgmymtcwmdmxntcwnzg0otqwmdq0in0sinnpz25hdhvyzsi6iij9",
"edge_media_to_tagged_user":{
"edges":[
]
},
"dash_info":{
"is_dash_eligible":false,
"video_dash_manifest":null,
"number_of_qualities":0
},
"video_url":" scontent-nrt1-1.cdninstagram /v/t50.2886-16/76813114_409612366399145_1408226497651154317_n.mp4?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=105&_nc_ohc=bghtgnoruamax-9y27s&oe=5e47a857&oh=a8ad29e7b500491d489c70b5868a8253",
"video_view_count":66853,
"edge_media_to_caption":{
"edges":[
{
"node":{
"text":"what’s more unconventional than free hot wheels from @magnuswalker? find out at the mobil 1? booth at the @semashow on wednesday from 1-2pm."
}
}
]
},
"shortcode":"b4dgddgbpam",
"edge_media_to_comment":{
"count":16,
"page_info":{
"has_next_page":true,
"end_cursor":"qvfcylnyrmvswvlougfru190blu2c3lirdfnsml0stdheufmswrnt2cwvhlya1lqn2nqetntqklruew4nlvzslawsjzwt0vzmkzjajrtdfdhbzy3me9req=="
},
"edges":[
{
"node":{
"id":"18079791781084833",
"text":"bro wasn’t he in nfs 2015?",
"created_at":1573097162,
"did_report_as_spam":false,
"owner":{
"id":"9187362588",
"is_verified":false,
"profile_pic_url":" scontent-nrt1-1.cdninstagram /v/t51.2885-19/s150x150/50061151_2815951648422474_7341681516549767168_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_ohc=kwasm69liviax8brnnt&oh=953e8cb1c6c8fdc85d12eb6c6a6a7781&oe=5ec22aee",
"username":"mr._shredtastic"
},
"viewer_has_liked":false
}
},
{
"node":{
"id":"18079904509082859",
"text":"i need that so bad !!!",
"created_at":1573230058,
"did_report_as_spam":false,
"owner":{
"id":"53918627",
"is_verified":false,
"profile_pic_url":" scontent-nrt1-1.cdninstagram /v/t51.2885-19/s150x150/36979131_208112720044452_8451014295717675008_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_ohc=dfcoiecknaoax_mpljj&oh=5dc7892f52319c9469712048acc3418f&oe=5ed352fc",
"username":"snipes74"
},
"viewer_has_liked":false
}
},
{
"node":{
"id":"18107091289064729",
"text":"any other way to get that vw",
"created_at":1573230092,
"did_report_as_spam":false,
"owner":{
"id":"53918627",
"is_verified":false,
"profile_pic_url":" scontent-nrt1-1.cdninstagram /v/t51.2885-19/s150x150/36979131_208112720044452_8451014295717675008_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_ohc=dfcoiecknaoax_mpljj&oh=5dc7892f52319c9469712048acc3418f&oe=5ed352fc",
"username":"snipes74"
},
"viewer_has_liked":false
}
},
{
"node":{
"id":"18069417481164690",
"text":"@bananavw",
"created_at":1573230807,
"did_report_as_spam":false,
"owner":{
"id":"53918627",
"is_verified":false,
"profile_pic_url":" scontent-nrt1-1.cdninstagram /v/t51.2885-19/s150x150/36979131_208112720044452_8451014295717675008_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_ohc=dfcoiecknaoax_mpljj&oh=5dc7892f52319c9469712048acc3418f&oe=5ed352fc",
"username":"snipes74"
},
"viewer_has_liked":false
}
}
]
},
"edge_media_to_sponsor_user":{
"edges":[
]
},
"comments_disabled":false,
"taken_at_timestamp":1572908094,
"edge_media_preview_like":{
"count":1396,
"edges":[
]
},
"gating_info":null,
"fact_check_overall_rating":null,
"fact_check_information":null,
"media_preview":"aceqwji2jba4wr2plslgwgqm06giynganhpski8kvciuiy8hyzt3lngfgap5mprimefuhyrzx6dqazwxacugehp/bop ek/l/wdzuvl4oosbpgaxiycemauwa7zedtgdz/t059okhjqdtyw6d/p e/pvp38lfi4wbxx1/mf5ud3ljzjtmyumzaji6fnwaxiiptv tuc4wrn6mqdhjgpptjdd7uvc8il3/oika8w5zkn8budyhp3jz vacx8r9bxvg6 6prre49jm2ku5vjba68u9utlb/rb9koqux6ksuuh2p//z",
"owner":{
"id":"4477364796",
"username":"mobil1"
},
"location":{
"id":"43168083",
"has_public_page":true,
"name":"the sema show",
"slug":"the-sema-show"
},
"viewer_has_liked":false,
"viewer_has_saved":false,
"viewer_has_saved_to_collection":false,
"viewer_in_photo_of_you":false,
"viewer_can_reshare":true,
"thumbnail_src":" scontent-nrt1-1.cdninstagram /v/t51.2885-15/sh0.08/e35/c0.90.720.720a/s640x640/70288458_2432643487003298_7115159233566819988_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=102&_nc_ohc=rkkgrmnh-okax8f6tbb&oh=17cc7d18c300e0338e3dbed3935030cf&oe=5e47626f",
"thumbnail_resources":[
{
"src":" scontent-nrt1-1.cdninstagram /v/t51.2885-15/e35/c0.90.720.720a/s150x150/70288458_2432643487003298_7115159233566819988_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=102&_nc_ohc=rkkgrmnh-okax8f6tbb&oh=f59e78ccc253a8f3d8bddef5be6071c3&oe=5e47c35b",
"config_width":150,
"config_height":150
},
{
"src":" scontent-nrt1-1.cdninstagram /v/t51.2885-15/e35/c0.90.720.720a/s240x240/70288458_2432643487003298_7115159233566819988_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=102&_nc_ohc=rkkgrmnh-okax8f6tbb&oh=9f59996063eca96cb1da90e3d27bcd43&oe=5e47c89d",
"config_width":240,
"config_height":240
},
{
"src":" scontent-nrt1-1.cdninstagram /v/t51.2885-15/e35/c0.90.720.720a/s320x320/70288458_2432643487003298_7115159233566819988_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=102&_nc_ohc=rkkgrmnh-okax8f6tbb&oh=6bf1a75f13db6b97916d88e732ee6c0f&oe=5e47c6e3",
"config_width":320,
"config_height":320
},
{
"src":" scontent-nrt1-1.cdninstagram /v/t51.2885-15/e35/c0.90.720.720a/s480x480/70288458_2432643487003298_7115159233566819988_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=102&_nc_ohc=rkkgrmnh-okax8f6tbb&oh=092766a015c7136dba05f5be0341e5fb&oe=5e474fa4",
"config_width":480,
"config_height":480
},
{
"src":" scontent-nrt1-1.cdninstagram /v/t51.2885-15/sh0.08/e35/c0.90.720.720a/s640x640/70288458_2432643487003298_7115159233566819988_n.jpg?_nc_ht=scontent-nrt1-1.cdninstagram &_nc_cat=102&_nc_ohc=rkkgrmnh-okax8f6tbb&oh=17cc7d18c300e0338e3dbed3935030cf&oe=5e47626f",
"config_width":640,
"config_height":640
}
]
}
}
文章目录
零、会触发回调接口失效的原因1、更换ssl证书导致2、变更ip地址3、账户权限变更
一、配置facebook 环境1)创建一个用于调试messenger的8797威尼斯老品牌主页2)配置webhook回调地址3)如何测试facebook
二、开始开发messenger1、不使用辅助sdk2、使用辅助sdk2.1 基础jar包依赖流程1) github 地址 :2)打包加入lib依赖:3)新版webhook 消息类型分析2.2 全盘cv(拷贝忍者自己改)
三、功能搭建组合1、快速回复(按钮)参数解释(button)1)纯文本2)文字快速带背景3)位置快速回复4)获取用户号码5)获取用户电子邮件
2、模版信息模版信息统一调用方法1)常规模版参数解释(generic)1、轮播展示(最多10个元素)2、单元素配合按钮(每个元素最多3个按钮)
2)列表模版参数解释(list)1、默认首列覆盖文本的封面图像2、无格式列表展示
3)按钮模版(button)参数解释(button)1、一行text说明后,排列按钮
2、8797威尼斯老品牌主页欢迎讯息
四、不基于第三方直接偷懒(憨憨的行为)五、fb针对其他拓展性功能支持1、支持集成聊天浮动窗口2、支持帖子回复
千万不要看中文,千万不要看中文,千万不要看中文。建议英文加自己的翻译去翻译,中文文档是过时的,注意。 我又从繁体的输入法回来了~~
梦开始的地址: developers.facebook /
实际上所谓接入facebook,通常指的是messenger 平台 messenger开发文档
零、会触发回调接口失效的原因
1、更换ssl证书导致
更新ssl证书,由于生成的证书链变化也会导致失效
2、变更ip地址
虽然可能是绑定域名,但是会检测ip地址变动
3、账户权限变更
2022年4月前,develop权限用户旧版本设置的8797威尼斯老品牌主页还是生效,4月后,develop仅能设置自己创建的8797威尼斯老品牌主页,需要admin才可以调用拥有者的8797威尼斯老品牌主页。
一、配置facebook 环境
1)创建一个用于调试messenger的8797威尼斯老品牌主页
2)配置webhook回调地址
fbbottoken 自定义,用于配置回调地址
fbpageaccesstoken 通常在配置回调地址后配置
fbbottoken=lg_token_for_test fbpageaccesstoken=eaapek646zc2kbanaleglxdhohzbstkaejzczc5fvrzazc1vriyavspmzagyysgmy4iwmoyslhklmm94h6fub04ixwyszbmonqemwsmzmxmgykhggg0pjh6n52xlylcsyrm8ys0qqtfhnchcxoebfpws0bmyvr0gyjzcfbjyxzy92oywngjtkv4tc
3)如何测试facebook
messenger搜索自己的8797威尼斯老品牌主页,就可以沟通了
二、开始开发messenger
1、不使用辅助sdk
developers.facebook /docs/messenger-platform/
自己慢慢看,如果有时间,我也自己搞
2、使用辅助sdk
2.1 基础jar包依赖流程
这个,我们可以自定义sdk包,然后根据自己需求做出改动 tips: 建议直接复制jbot内文件,避免依赖等问题,仅需删除botwebsockethandler 即可
1) github 地址 :
github /rampatra/jbot
2)打包加入lib依赖:
编译好后直接加入
3)新版webhook 消息类型分析
发生各种交互或事件(包括某人发送消息时)时通知您。messenger平台将webhook事件作为post请求发送到您的webhook。
一般情况仅需勾选message事件即可
可以更方便的通过事件驱动类型来监听数据
#具体webhook 可以参照
developers.facebook /docs/messenger-platform/webhook
通过webhook设置不同的类型,可以对不同类型进行分配各自的回调处理(若配置回调后,持续不响应webhook事件,会自动相应递进警告且自动取消webhook订阅的问题)
2.2 全盘cv(拷贝忍者自己改)
通常我建议自行更改http客户端,以免出现参数无法传递的问题
定位到fbapiendpoints,将其中的resttemplate替换为自己的http客户端。
三、功能搭建组合
主要针对收发信息的大部分内容进行操作,结合新版webhook来对消息内容解析
1、收发事件基本已经归类到eventtype中,通过对时间的监听收发
2、已经对messenger回复信息进行包装为event,可以轻松获取结构化的信息
1、快速回复(按钮)
对应:quick_reply
可以针对性的提供按钮,最多13个
回复时 将已点击按钮的标题作为消息发布到对话中。
参数解释(button)
button
属性类型说明content_typestring必须是以下类型之一text:发送文本按钮user_phone_number:发送一个按钮,让消息接收人可以发送与其帐户绑定的手机号。user_email:发送一个按钮,让消息接收人可以发送与其帐户绑定的邮箱。title字符串如果 content_type 为“text”,则必须设置此属性。这些文本将显示在快速回复按钮上。请勿超过 20 个字符。payload字符串,数值如果 content_type 为“text”,则必须设置此属性。将通过messaging_postbacks webhook 事件向您发回的自定义数据。不超过 1000 个字符。 如果设置了 image_url,则可将此项设置为空字符串image_url字符串**可选。**将在文本快速回复按钮上显示的图片的网址。图片大小不低于 24 x 24 像素。如果图片过大,系统会自动进行裁剪并调整大小。 如果 title 为空字符串,则必须设置此属性。
1)纯文本
#只需要在text填入所需回复文本即可
reply(event event, string text)
2)文字快速带背景
#参数说明
title:展示的内容
payload:真实返回的内容
image_url:背景图url
#单一按钮
message = new message().setquickreply(new button()
.settitle("展示内容").setpayload("真实相应内容").setimage);
#多按钮
message = new message().setquickreplies(new button[]{
new button().settitle("展示内容1").setpayload("真实相应内容2").setimage,
new button().settitle("展示内容1").setpayload("真实相应内容2").setimage
});
#调用上方message
reply(event,message)
3)位置快速回复
message = new message().setquickreply(new button().setcontenttype("location").settitle("请求位置"));
#调用上方message
reply(event,message)
4)获取用户号码
如果用户的个人资料没有电话号码,则不会显示快速回复。
new message().setquickreply(new button().setcontenttype("user_phone_number").settitle("获取用户号码"));
#调用上方message
reply(event,message)
5)获取用户电子邮件
如果用户的个人资料没有电子邮件地址,快速回复将不会显示
new message().setquickreply(new button().setcontenttype("user_email").settitle("获取用户电子邮箱"));
#调用上方message
reply(event,message)
2、模版信息
模版信息统一调用方法
#下方都属于message参数的各种类型
reply(event,message)
1)常规模版
参数解释(generic)
message.attachment
属性类型描述typestring值必须是 templatepayloadpayload常规模板
message.attachment.payload
属性类型描述template_typestring值必须是 genericimage_aspect_ratiostring**可选的。**用于渲染由指定的图像的宽高比element.image_url。必须为horizontal(1.91:1)或square(1:1)。默认为horizontal。elementselement[]一个element对象数组,描述要发送的通用模板的实例。指定多个元素将发送可水平滚动的模板轮播。最多支持10个元素。
message.attachment.payload.elements
下方button为快速回复的对象
属性类型描述titlestring显示在模板中的标题。最多80个字符。subtitlestring**可选的。**在模板中显示的字幕。最多80个字符。image_urlstring**可选的。**要在模板中显示的图像的url。default_actionbutton可选的。点击模板时执行的默认操作。接受与 上述快速回复按钮相同的属性,但除外title。buttonsbutton[]**可选的。**附加到模板的按钮数组。每个元素最多支持3个按钮。
1、轮播展示(最多10个元素)
#多个element可以用作轮播图
message message = new message();
element[] element = new element[]{
new element().settitle("test1").setimage
.setsubtitle("we have the right hat for everyone 11111")
.setdefaultaction(new button().settype("web_url").set
.setmessengerextensions(false).setwebviewheightratio("tall")),
new element().settitle("test2")
.setimage
.setsubtitle("we have the right hat for everyone 22222")
.setdefaultaction(new button().settype("web_url")
.set.setmessengerextensions(false)
.setwebviewheightratio("tall"))};
message.setattachment(new attachment().settype("template")
.setpayload(new payload().settemplatetype("generic").setelements(element)));
2、单元素配合按钮(每个元素最多3个按钮)
message message = new message();
element[] element = new element[]{
new element().settitle("test1").setimage
.setsubtitle("we have the right hat for everyone 11111")
.setdefaultaction(
new button().settype("web_url").set
.setmessengerextensions(false).setwebviewheightratio("tall"))
.setbuttons(new button[]{new button().settitle("按鈕描述")
.setpayload("真实相应内容")
})
};
message.setattachment(new attachment().settype("template")
.setpayload(new payload().settemplatetype("generic").setelements(element)));
2)列表模版
参数解释(list)
message.attachment
属性类型描述typestring值必须是 templatepayloadpayload常规模板
message.attachment.payload
属性类型描述template_typestring值必须为 listtop_element_stylestring*可选。 设置第一个列表项的格式。messenger 网页客户端目前仅呈现compact 格式。 默认compact:呈现无格式的列表项。 large:将第一个列表项呈现为封面项。buttonsbutton[]可选。 显示在列表底部的按钮。最多支持 1 个按钮;接受与 上述快速回复按钮*相同的属性elementselement[]描述列表中各项目的一组元素。 要求最少 2 个元素。最多支持 4 个元素。sharableboolean*可选。 设置为 true,可为模板消息启用 messenger 原生分享按钮。默认为 false。
message.attachment.payload.elements
属性类型描述titlestring显示为列表项标题的字符串。 不超过 80 个字符。如果标题跨越太多行,则可能会被截断。 元素也必须至少设置 image_url 或subtitle 之一。subtitle字符串*可选。 显示为列表项副标题的字符串。不超过 80 个字符。如果副标题跨越太多行,则可能会被截断。 元素必须至少设置 image_url 或subtitle 之一。image_url字符串*可选。 要显示在列表项中的图片网址。 元素必须至少设置 image_url 或subtitle 之一。default_actionbutton*可选。接受与 上述快速回复按钮相同的属性,指定用户轻触列表项时要执行的默认操作。 仅当 messenger_extensions 属性设置为 true 时允许使用buttonsbutton[]*可选。* 要显示在列表项中的按钮。最多支持 1 个按钮
message message = new message();
element[] elements = new element[]{
new element().settitle("animatescroll").setsubtitle("a jquery plugin for animating scroll.")
.setimage
.setdefaultaction(new button().settype("web_url").setmessengerextensions(true)
.set),
new element().settitle("windows on top").setsubtitle("keeps a specific window on top of all others.")
.setimage
.setdefaultaction(new button().settype("web_url").setmessengerextensions(true)
.set),
new element().settitle("simplefill").setsubtitle("simplest form filler ever.")
.setimage
.setdefaultaction(new button().settype("web_url").setmessengerextensions(true)
.set)
};
1、默认首列覆盖文本的封面图像
message.setattachment(new attachment().settype("template").setpayload(new payload()
.settemplatetype("list").setelements(elements)))
2、无格式列表展示
差别正如属性top_element_style 为compact
message.setattachment(new attachment().settype("template").setpayload(new payload()
.settemplatetype("list").setelements(elements)
.settopelementstyle("compact")))
3)按钮模版(button)
参数解释(button)
message.attachment
属性类型描述typestring值必须是 templatepayloadpayload常规模板
message.attachment.payload
属性类型描述template_typestring值必须是 buttontextstringutf-8编码的文本,最多640个字符。文本将出现在按钮上方。buttonsbutton[]可选。 显示为号召性用语的1-3个按钮集合;接受与 上述快速回复按钮*相同的属性
1、一行text说明后,排列按钮
message message = new message();
button[] buttons = new button[]{
new button().settype("web_url").set.settitle("jbot docs"),
new button().settype("web_url").set.settitle("buttom template")
};
message.setattachment(new attachment().settype("template").setpayload(new payload()
.settemplatetype("button").settext("these are 2 link buttons.").setbuttons(buttons)))
2、8797威尼斯老品牌主页欢迎讯息
图示开始按钮及欢迎语: 参考链接 tips: 需要在8797威尼斯老品牌主页开启问候语后生效 多言语列表:支持地区
//【设置开始按钮的方法】
//这里"开始"代表点击后返回给服务器的载体讯息
setgetstartedbutton("开始");
//【设置问候语的方法】
//可配置参数
//{{user_first_name}}
//{{user_last_name}}
//{{user_full_name}}
//可兼容多言语
setgreetingtext(new payload[]{new payload().setlocale("default").settext(greeten),
new payload().setlocale("zh_cn").settext(greetsc),
new payload().setlocale("zh_hk").settext(greettc),
new payload().setlocale("en_us").settext(greeten)});
//例如:greetsc 值为:你好,{{user_full_name}},歡迎來到demo
四、不基于第三方直接偷懒(憨憨的行为)
等我有空就脑抽作
持续更新中(如果记得的话)~~
五、fb针对其他拓展性功能支持
1、支持集成聊天浮动窗口
相当于在自己的网站集成一个图标,点击即可唤起facebook,可设置为需要登录或游客形式交互。 详细链接:插件集成
2、支持帖子回复
相当于发表的文章内容评论讯息等回复。 值得注意的是,截至2022.4.28,官方描述为仅7天内的讯息可回复 详细链接 :文帖回复
还没有评论,来说两句吧...