Firebase의 무료 테두리로 팬을 확장했습니다.

"신화사의 트윗을 보고 북마크하고 있었는데 Twitter의 API는 3600건밖에 거슬러 올라갈 수 없다..."라는 슬픈 마음, 누구나 한번은 안은 적이 있다고 생각합니다. 나는 안았다. 거기서, 자전으로 후보를 보존하기로 했습니다.

개요


  • Firebase에 트윗을 저장하는 메커니즘을 만들었습니다.
  • 스마트폰에 저장하고 있다면 언제 죽을지 모르기 때문에 Firebase를 이용해 온라인으로 저장하기로 했다.

  • 다만, 여러가지 문제가 발생하기 때문에 첨부된 화상이나 동영상은 보존하지 않습니다. (직 링크는 저장한다)

    구성



    클라이언트 측은 방금 자신의 안드로이드 용 트위터 클라이언트를 만들고 사용했기 때문에 거기에 버튼을 추가하여 서버에 던지는 처리를 구현했습니다.
    서버 측은 보통으로 빌리면 돈이 듭니다만, 무료로도 충분히 사용할 수 있는 Firebase라고 하는 신 서비스가 있으므로 이것을 사용하기로 했습니다.
  • 무과금 친화적
  • Cloud functions (쉽게 API를 설치할 수 있는 사람) 12.5만/월 무료
  • Cloud firestore(간편하게 DB를 설치할 수 있는 사람) 용량 1 GiB/월, 수만 액세스/일이 무료
  • 기타 가득 무료 htps : // 푹 빠져라. 오, ぇ. 이 m/p 리신 g? hl = 그럼

  • Firebase라는 프레임 워크 내에서 최소한의 코딩 량으로 API, DB 설치를 포함한 대부분의 작업이 가능합니다
  • 모든 플랫폼에 대한 SDK가 충실합니다

  • 신 서비스입니다.

    구현



    DB



    Cloud Firestore를 사용했습니다. 버튼을 깜박이는 것만으로 정의할 수 있습니다.


    컬렉션은 문서 모음입니다.
    1 트윗의 데이터를 1 문서로서 저장하는 컬렉션 pics 와, 보존 총수를 카운트하기 위한 문서를 1 개만 가지는 컬렉션 info 를 설정했습니다.


    API



    Cloud Functions를 사용했습니다. 명령을 치는 것만으로 바로 외부에 게시할 수 있습니다. Cloud Firestore에 쉽게 액세스할 수 있습니다.

    단지 저장하는 것 뿐만 아니라, 같은 계정의 트윗을 몇 건 푸우고 있는지를 클라이언트에 돌려주도록 했습니다.
    이를 통해 "...이렇게 멋진 그림을 그리는 사람인데 아직 2건밖에 없었어...?"라는 주의를 낳고 곧바로 거슬러 올라가 시작할 수 있습니다.
    
    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    admin.initializeApp();
    const db = admin.firestore();
    
    // エンドポイント /save を設置
    exports.save = functions.https.onRequest((request, response) => {
        const {url,tweet_id,user_id,text,tweet_link,screen_name,status} = request.body 
    
        //認証
        if(request.get('Authentication')!=="*********"){
            response.send("none")
            return
        }
    
        //ツイートが保存されるコレクション
        const pics = db.collection('pics')
        //保存総数をカウントするためのコレクション
        const statistics = db.collection('info').doc('statistics')
    
        //tweet_idで検索し、既に保存していないか確認する
        pics.where('tweet_id','==',tweet_id).get()
            .then(snapshot=>{
                //同じユーザーの保存済みツイート数を確認する
                pics.where('user_id','==',user_id).get().then(user_pics =>{
                    if(snapshot.size!==0){
                        // 既に保存済みならその旨を「同じユーザーの保存済みツイート数」とともにメッセージとして返す
                        response.send(`既にあります。全${user_pics.size}件`)                
                    }else{
                        //追加
                        pics.add(
                            {
                                url:url,
                                tweet_id:tweet_id,
                                tweet_id_str:status.id_str,
                                tweet_link:tweet_link,
                                user_id:user_id,
                                text:text,
                                status:status,
                                screen_name:status.user.screen_name,
                                timestamp: admin.firestore.FieldValue.serverTimestamp(),
                            })
                        statistics.update("count",admin.firestore.FieldValue.increment(1))
                        // 「同じユーザーの保存済みツイート数」を返す
                        response.send(`追加しました。${user_pics.size+1}件目`)
                    }
                    return;
                }).catch(err=>{console.log(err)})   
                return
            }).catch(err=>{console.log(err)})   
    });
    

    클라이언트



    먼저 훑어본 후 위의 API에 데이터를 던져 응답을 표시합니다.
    public static void save_status(Context context, account, TwitterStatus status){
    
        // とりあえずふぁぼる
        account.favorite(status, true, context);
    
        // 通信用スレッドを立ち上げてサーバーに投げる
        Handler handler = new Handler();
        new Thread(()->{
            try {
                // データの準備
                JSONObject json = new JSONObject();
                json.put("url",new JSONArray(status.getMedia().getURLs()));
                json.put("tweet_id",status.getId());
                json.put("user_id",status.getUser().getId());
                json.put("text",status.getTextWithoutMediaLink());
                json.put("tweet_link",status.getLink());
                json.put("screen_name",status.getUser().getScreenName());
                json.put("status",status.getJSON());
    
                // /save へ送信
                URL url = new URL("https://us-central1-********.cloudfunctions.net/save"); //用意したエンドポイント
                HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
                connection.setRequestProperty("Authentication","************");
                connection.setRequestProperty("Content-Type","application/json");
                connection.setRequestMethod("POST");
                PrintStream ps = new PrintStream(connection.getOutputStream());
                ps.print(json.toString());
                ps.close();
    
                //レスポンスを表示
                String response = new BufferedReader(new InputStreamReader(connection.getInputStream())).readLine();
                handler.post(()->{
                    Toast.makeText(context, response+"\n"+description, Toast.LENGTH_SHORT).show();
                });
            } catch (MalformedURLException ignored) {
            } catch (IOException ignored) {
            } catch (JSONException ignored) {
            }
        }).start();
    }
    



    DB의 내용을 나열하고 스스로 보기 위한 웹사이트를 Cloud Hosting했습니다만 졸론이 어려우므로 할애합니다.

    기타



    Cloud Firestore는 문서를 해당 필드를 사용하여 검색하거나 재정렬할 수 있습니다.

    시험에 리스인수로 정렬해 보았습니다.






    이상

    좋은 웹페이지 즐겨찾기