ツイートからビデオを取得するためのGOのマイクロサービス

こんにちは、ハブラフチャン! 初心者向けの記事、ここでは見られないような新しいアイデア。 そして、おそらく、この機能はさまざまな言語で何十回も実装されました。 アイデアは、ビデオを含むTwitterの投稿へのリンクを取得した場合、このビデオを選択してmkvに変換することです。







ビジネスに!



必要なもの:









ビデオからのツイートへのリンクがあります:







https://twitter.com/FunnyVines/status/1101196533830041600
      
      





リンク全体のうち、数字で構成されるIDのみに関心があるため、基本的な規則性によってデジタル部分文字列全体を引き出します。







 var reurl = regexp.MustCompile(`\/(\d*)$`) //   -  e.GET("/*video", func(c *fasthttp.RequestCtx) { //      url := reurl.FindSubmatch([]byte(c.UserValue("video").(string)))
      
      





受信したIDを使用して、アドレスに移動します。







 resp, err := client.Get("https://twitter.com/i/videos/tweet/" + id)
      
      





ビデオプレーヤーのJSコードへのリンクはどこで入手できますか?







src="https://abs.twimg.com/web-video-player/TwitterVideoPlayerIframe.f52b5b572446290e.js"





このjsファイルから、非常に重要なものが1つ必要です。それは、twitter apiでの許可の担い手です。







彼を正規表現!







 re, _ := regexp.Compile(`(?m)authorization:\"Bearer (.*)\",\"x-csrf`)
      
      





これは、APIにアクセスするには十分ではありません、まだguest_tokenが必要です。 アドレスにPOST要求を適用することで取得できます-" https://api.twitter.com/1.1/guest/activate.json "、そこに渡す:cookieからpersonalization_idとguest_id(前にアクセスしたときにサーバーからの応答で受信したURL):







  var personalization_id, guest_id string cookies := resp.Cookies() for _, cookie := range cookies { if cookie.Name == "personalization_id" { personalization_id = cookie.Value } if cookie.Name == "guest_id" { guest_id = cookie.Value } } // // Get Activation url, _ := url.Parse("https://api.twitter.com/1.1/guest/activate.json") request := &http.Request{ Method: "POST", URL: url, Header: http.Header{ "user-agent": []string{"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}, "accept-encoding": []string{"gzip", "deflate", "br"}, "authorization": []string{"Bearer " + bearer}, "cookie": []string{"personalization_id=\"" + personalization_id + "\"; guest_id=" + guest_id} }, } resp, err = client.Do(request)
      
      





guest_token

それは定期的に変更されますが、呼び出す頻度はわかりませんでした(むしろ、タイマーで変更されます-15分間隔)が、定期的に/1.1/guest/activate.jsonをアクティブ化すると300リクエストのAPI制限をバイパスできるようです







答えはgzipです。Goで展開できます。次のようなものです。







 res, err := gzip.NewReader(resp.Body) if err != nil { return "", err } defer res.Close() r, err := ioutil.ReadAll(res)
      
      





それだけです! これで、APIを呼び出すために必要なものがすべて揃いました。







  url, _ = url.Parse("https://api.twitter.com/1.1/videos/tweet/config/" + id + ".json") request = &http.Request{ Method: "GET", URL: url, Header: http.Header{ "user-agent": []string{"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}, "accept-encoding": []string{"gzip", "deflate", "br"}, "origin": []string{"https://twitter.com"}, "x-guest-token": []string{gt.GuestToken}, "referer": []string{"https://twitter.com/i/videos/tweet/" + id}, "authorization": []string{"Bearer " + bearer}}, } resp, err = client.Do(request)
      
      





APIからの応答は、ビデオの説明を含むJsonであり、最も重要なのは、受信するURL(playbackUrl)です。







 {"contentType":"media_entity","publisherId":"4888096512","contentId":"1096941371649347584","durationMs":11201,"playbackUrl":"https:\/\/video.twimg.com\/ext_tw_video\/1096941371649347584\/pu\/pl\/xcBvPmwAmKckck-F.m3u8?tag=6","playbackType"
      
      





そして最後に、ビデオアドレスを取得し、ffmpegに送信します。2つの可能なフォーマットを見たビデオフォーマットをチェックしながら、最初はmp4です。







 if strings.Contains(videoURL.Track.PlaybackURL, ".mp4") { convert := exec.Command("ffmpeg", "-i", videoURL.Track.PlaybackURL, "-c", "copy", "./videos/"+id+".mkv") convert.Stdout = os.Stdout convert.Stderr = os.Stderr if convert.Run() != nil { return "", err } return id, nil }
      
      





2番目はm3u8プレイリストファイルです。このオプションでは、もう1ステップが必要です-GETを取得します

彼、および目的の解像度でコンテンツのURLを取得します。







 #EXT-X-INDEPENDENT-SEGMENTS #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=256000,RESOLUTION=180x316,CODECS="mp4a.40.2,avc1.4d0015" /ext_tw_video/1039516210948333568/pu/pl/180x316/x0HWMgnbSJ9y6NFL.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=832000,RESOLUTION=464x816,CODECS="mp4a.40.2,avc1.4d001f" /ext_tw_video/1039516210948333568/pu/pl/464x816/Z58__ptq1xBk8CIV.m3u8
      
      





そしてまだ-ffmpeg。







そして今、HTTPサーバーについて少し



私が使用した:









ロジックは次のとおりです。サーバーを起動します。







 cfg := tcplisten.Config{ ReusePort: true, FastOpen: true, DeferAccept: true, Backlog: 1024, } ln, err := cfg.NewListener("tcp4", ":8080") if err != nil { log.Fatalf("error in reuseport listener: %s\n", err) } serv := fasthttp.Server{Handler: e.Handler, ReduceMemoryUsage: false, Name: "highload", Concurrency: 2 * 1024, DisableHeaderNamesNormalizing: true} if err := serv.Serve(ln); err != nil { log.Fatalf("error in fasthttp Server: %s", err) }
      
      





そして、1つのルートのみ処理します/ *ビデオ:







 //  : //  http://localhost:8080/https://twitter.com/FunnyVines/status/1101196533830041600 //   http://localhost:8080/1101196533830041600 e.GET("/*video", func(c *fasthttp.RequestCtx) {
      
      





どうすればこれをすべて収集できますか?



たとえば、単純なMakefile(make build、make run ...):







 build: go build -o main docker build -t tvideo . run: go build -o main docker build -t tvideo . docker kill tvideo docker run -d --rm --name tvideo -v /etc/ssl:/etc/ssl:ro -v videos:/opt/videos -p 8080:8080 tvideo docker logs -f tvideo
      
      





フラグ "-v / etc / ssl:/ etc / ssl:ro"に注意してください。ベースイメージubuntuにはルート証明書がなく、httpクライアントはhttps twitterを認識しませんでした。 --mountを正しく使用する方法)。







Dockerfile







 FROM ubuntu //     docker image COPY main /opt/app RUN apt-get update && \ //   apt-get install -y ffmpeg && \ chmod +x /opt/app EXPOSE 8080 WORKDIR /opt CMD ./app
      
      





間違いなく、私はこの記事でアメリカを発見しませんでしたが、突然それは誰かにとって便利になるでしょう。







ソースはこちらから入手できます








All Articles