Firebase의 무료 테두리로 팬을 확장했습니다.
19893 단어 안드로이드FirebaseTwitterAPIFirestore
개요
다만, 여러가지 문제가 발생하기 때문에 첨부된 화상이나 동영상은 보존하지 않습니다. (직 링크는 저장한다)
구성
클라이언트 측은 방금 자신의 안드로이드 용 트위터 클라이언트를 만들고 사용했기 때문에 거기에 버튼을 추가하여 서버에 던지는 처리를 구현했습니다.
서버 측은 보통으로 빌리면 돈이 듭니다만, 무료로도 충분히 사용할 수 있는 Firebase라고 하는 신 서비스가 있으므로 이것을 사용하기로 했습니다.
신 서비스입니다.
구현
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는 문서를 해당 필드를 사용하여 검색하거나 재정렬할 수 있습니다.
시험에 리스인수로 정렬해 보았습니다.
이상
Reference
이 문제에 관하여(Firebase의 무료 테두리로 팬을 확장했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/0x83/items/d25d33ae921d4b076f15텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)