Messenger chatbot send youtube video 失敗心得
上午11:38Messenger chatbot send youtube video 失敗心得
因為專題想要開發一個bot可以推播特定的youtube影片給使用者,
然而youtube影片格式無法直接使用messenger bot 的 video api,api只吃類似.mp4格式的網址,
所以若使用者想在messenger看youtube影片,必須得不停的切換messenger and brower視窗,
對使用者體驗來說相當不便
所以運用了神通廣大的google大神,仍然宣告失敗,然而還是學到許多事情,所以記錄下來
youtube api 教學
youtube api還蠻簡單的,輕鬆使用get方法可以拿到頻道資訊 播放清單資訊 影片資訊等等
這是channel的 http request,可以抓取頻道資訊 要將{}改成自己的參數
https://www.googleapis.com/youtube/v3/channelSections?part=contentDetails&channelId={}&key={}
這是playlist的 http request,可以抓取播放清單資訊 要將{}改成自己的參數
https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails,snippet&maxResults=50&playlistId={}&key={}
以下code為對某頻道做search並抓去該頻道播放清單的video_id
import requests
import json
import sys
def main(argv):
key = "your api key"
cat_channel_id = "UC9egiwuJsQZ0Cy2to5fvSIQ" # cat channel id
jsondata = requests.get(
"https://www.googleapis.com/youtube/v3/channelSections?part=contentDetails&channelId={}&key={}".format(cat_channel_id, key)) # request channel information
data = json.loads(jsondata.text)
list_playlist = data['items'] # get playlists
count = 0
for playlist in list_playlist:
count = count + 1
if 'contentDetails' in playlist and 'playlists' in playlist['contentDetails']:
playlist_id = playlist['contentDetails']['playlists'][0]
print playlist_id
videos_json = requests.get(
'https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails,snippet&maxResults=50&playlistId={}&key={}'.format(playlist_id, key)) # request playlist information
videos_data = json.loads(videos_json.text)
print videos_data
videos = videos_data['items']
for video in videos:
if 'contentDetails' in video:
video_id = video['contentDetails']['videoId']
print "video_id={}".format(video_id) #print video id
print count
if __name__ == '__main__':
main(sys.argv[1:])
youtube dl in python
再來採用youtube dl 套件,想辦法獲取video的真實url,讓api可以傳送video
import youtube_dl
ydl = youtube_dl.YoutubeDL({'outtmpl': '%(id)s%(ext)s'})
with ydl:
result = ydl.extract_info(
'http://www.youtube.com/watch?v=ET0rV79uFDQ',
download=False # We just want to extract the info
)
if 'entries' in result:
# Can be a playlist or a list of videos
video = result['entries'][0]
else:
# Just a video
video = result
print(video)
video_url = video['url']
print(video_url)
很好,我拿到網址了,
https://r6—sn-u5oxu-uooe.googlevideo.com/videoplayback?ratebypass=yes&itag=22&requiressl=yes&expire=1495442327&mime=video%2Fmp4&key=yt6&sparams=dur%2Cei%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&ip=140.116.1.136&lmt=1492925516230696&dur=527.046&mt=1495420642&mv=m&ms=au&source=youtube&signature=DAD0CEE5063DE3B61E892B6A23EC6BAD16E124F0.C78C5E8FA97EA53668EBB9604976BD939829FAF9&initcwndbps=4775000&mm=31&mn=sn-u5oxu-uooe&id=o-AKRm_kSrfIkSvTcaOtsXmUPBRhb-JW2xHJPhQFHF3YDA&upn=zv89kP3EApo&ipbits=0&ei=Nk8iWfzoPJGb4AKty5ioBA&pl=19
但是這個網址fb仍然不吃…
結論:失敗,待解決
目前仍然想不到在messenger內直接看youtube影片的方法
目前最好的方式是採用general template,圖片用youtube api 抓到的縮圖
下方建button來讓使用者點擊進入youtu
be
telegram chatbot on heroku 建構 telegram 聊天機器人
下午2:58Telegram chatbot on heroku 建構 telegram 聊天機器人
學校期末專題要寫telegram的聊天機器人(一堆專題 )
摸了一下telegram並記錄下來
申請上比messenger簡單許多,只要跟bot father 講講話就申請完了
chatbot需要放在server上跑,而我選擇heroku
以下範例code deploy在heroku上 可以echo使用者的回應
範例code
bot.py
記得填上自己的token 跟 server的url
import telebot
import os
from flask import Flask, request
bot = telebot.TeleBot('your access token')
server = Flask(__name__)
@bot.message_handler(commands=['start'])
def start(message):
bot.reply_to(message, 'Hello, ' + message.from_user.first_name)
@bot.message_handler(func=lambda message: True, content_types=['text'])
def echo_message(message):
bot.send_message(message.from_user.id, message.text)
@server.route("/", methods=['POST'])
def getMessage():
bot.process_new_updates([telebot.types.Update.de_json(request.stream.read().decode("utf-8"))])
return "!", 200
@server.route("/")
def webhook():
bot.remove_webhook()
bot.set_webhook(url="your heroku application url")
return "!", 200
server.run(host="0.0.0.0", port=os.environ.get('PORT', 5000))
server = Flask(__name__)
requirements.txt
pyTelegramBotAPI==2.1.5
requests==2.7.0
telebot==0.0.3
logger==1.4
flask==0.11
Procfile
web: python bot.py
將這三個檔案deploy到heroku上即可
imgur-api-簡易申請流程-教學-python
下午2:33Imgur API 簡易申請流程 教學 python
簡介
imgur 個api蠻friendly的,因為專題需要一個圖床放圖片,所以就去摸了一下imgur 的一些簡單的操作,並記錄下來
申請
申請的流程相當簡單
申請完後會得到一組 Clinet ID 與 Client Serect
如果有去翻文件看過的話,會發現有些函式還需要access token 跟refresh token
疑~阿這兩個要哪裡來
這就是比較麻煩的OAUth的認證,因為當初不懂這是在幹嗎的,用了超級久才用出來,用出來後系統就會寄這兩個token給你
1.pip install imgurpython
2.從imgur 的 github上抓範例code下來 https://github.com/Imgur/imgurpython/tree/master/examples
3.修改auth.ini的 client id 與secret為自己的資料
4.run auth.py 並依照指示操作
5.get token
範例程式
這個程式可以將照片網址的照片上傳到imgur的圖床,ㄅ,,當然也可以改成用別種方式上傳(檔案等等 要換別的函式),填上個人資訊就可以自動化輕鬆上傳圖片至圖床了
# -*- coding: utf-8 -*-
"""
Created on Tue May 02 22:16:19 2017
@author: vic
"""
from imgurpython import ImgurClient
def upload_photo(image_url):
client_id = 'your id'
client_secret = 'your serect'
access_token = 'your token'
refresh_token = 'your token'
client = ImgurClient(client_id, client_secret, access_token, refresh_token)
album = None # You can also enter an album ID here
config = {
'album': album,
}
print("Uploading image... ")
image = client.upload_from_url(image_url, config=config, anon=False)
print("Done")
return image['link']
解決 No JSON object could be decoded 的方法教學
晚上10:15解決 No JSON object could be decoded 的方法教學
我嘗試將網路上的開放資料傳到DB上
然而在json.load時一直跳No JSON object could be decoded 的bug
編碼已經是utf8,仍然跳bug
為此研究一番,紀錄一下自己的解決方法
系統:windows
對沒錯,這問題就是出在windows
在windows中,json就算存成utf8編碼,仍然會有問題,
因為windows預設是有BOM的utf8編碼
但這會被python判斷錯誤
因此必須調整成無BOM的編碼
可以在notepad裡面修改編碼
這樣或許就能解決 No JSON object could be decoded 的問題