Python は、Feishu 開発プラットフォーム API を使用して、多次元テーブルまたはスプレッドシートからデータをクロールし、ローカル ファイルに書き込みます。

Feishu 開発プラットフォームが提供する API インターフェイスを使用して、多次元テーブル データをクロールし、ローカルに保存します。スプレッドシート データをクロールすることもできます。ただし、スプレッドシートに関連する API は、使用時にデバッグを提供しません。スプレッドシートを次のように変換します。多次元テーブルです。
ビジネス ロジックを完成させるためのコードを記述するこの種の API ドキュメントを見たのは初めてです。また、私自身 Java 言語を使用していますが、Python にはあまり詳しくありません。Python コードを書くのはあまり得意ではありません。 csdn では Feishu API についての投稿が少ないので(当時検索しましたが目的のものが見つかりませんでした)、このブログを書きました(これも初めてでした)。皆さんの参考にしてください。何か質問がある場合は、修正していただければ幸いです。
一般的なプロセス: 
        1: 最初のステップは、Feishu 開発者バックエンドで独自のアプリケーションを作成し、対応する権限を付与することです
        。2 : 開発ドキュメント、対応する API、それらのパラメーターの意味を読み、デバッグ後、書かれたコード (応答本文) があり、必要なものを取得するコード ロジックを作成します。コードの一般的なプロセス: コンソールは関連する情報を読み取ります
 。パラメータ、ローカル設定ファイルの暗号化と書き込み、設定の読み取り ファイルの関連パラメータ、情報の取得、パラメータの受け渡し、データのクローリング import http.client import json import hashlib from grammar import TransferParametersAndEncryption from 

urllib.parse 
import 
urlparse 
parse_qs 
import hashlib 
import xml.etree.ElementTree as ET 
import Base64

#Encryption: md5 暗号化は不可逆です。ここでは他の暗号化方法、AES または bcrypt、sm4 を使用する必要がありますが、報告すると問題が発生します。Def encrypt(parameter) をここで改善する必要があります
: # パスワード暗号化に MD5 を使用します。
    他のより安全な暗号化アルゴリズムを選択することもできます。
    hash_object = hashlib.md5(parameter.encode()) 
    return hash_object.hexdigest() 

#パラメータを渡す: テーブルの情報を XML に書き込みます
def input_parameters(): 
    # Get app_id, app_secret, url 
    path = input("設定ファイルが保存されているアドレス") 
    user_appp_id = input("app_idを入力してください ") 
    user_app_secret = input("app_secretを入力してください ") 
    url = input("多次元テーブルのURLアドレス: " ) 
    table_name = input(" クロールするテーブル名を入力してください") 

    # 暗号化された appid,appSecret 
    encrypted_app_id = encrypt(user_appp_id) 
    encrypted_app_secret = encrypt(user_app_secret)
 
    # XML ドキュメントを作成
    root = ET.Element('table_info')
    パスワード要素.テキスト = テーブル名
    # 创建XML文档对オブジェクト
    user_element = ET.SubElement(root, 'Path') 
    user_element.text = path 
    #先使用原来の明文
    password_element = ET.SubElement(root, 'User_app_id') 
    #password_element.text = encrypted_app_idpassword_element.text 
    = user_app_idpassword_element 
    = ET。 SubElement(root, 'User_app_secret') 
    # パスワード要素.テキスト = encrypted_app_secret
    パスワード要素.
    テキスト = ユーザー アプリ_シークレット パスワード要素 = ET.SubElement(ルート, 'Url')パスワード要素.テキスト
    = url
    パスワード要素 = ET.SubElement(ルート, 'テーブル名')

    ツリー = ET.ElementTree(root) 

    # 将XML文档を文件treeに保存する
    .write(path, encoding='utf-8',xml_declaration=True)

    print("ユーザー名とパスワードは XML 設定ファイルに保存されています。") 

#xml 内の情報を取得し、辞書として返します
def get_parameters(): 
    # app_id、app_secret、url
    パスを取得します = input("クロールに必要ですdata 設定ファイルのアドレス") 
    tree = ET.parse(path) 
    root =tree.getroot() 

    path = なし
    user_appp_id = なし
    user_app_secret = なし
    url = なし
    table_name = なし

    table_info_dir = {}
    ルートの子の場合: 
        elif child.tag == 'Url':
            table_info_dir["URL"] = child.text 
        if child.tag == 'Path': 
            table_info_dir["Path"] = child.text 
        elif child.tag == 'User_appp_id':
            table_info_dir["User_app_id"] = child.text 
        elif child.tag == 'User_app_secret': 
            table_info_dir["User_app_secret"] = child.text 
        elif child.tag == 'Table_name': 
            table_info_dir["Table_name"] = child.text 

    # 解密暗号
    # パスワード = decrypt_password(encrypted_pa​​ssword) 

    return table_info_dir 

#获取access_token 
def accss_token(app_id,app_secret): 
    conn = http.client.HTTPSConnection("open.feishu.cn") 
    payload = json.dumps({ 
        "app_id": app_id、
        「app_secret」:app_secret 
    })

    ヘッダー = { 
        'Content-Type': 'application/json' 
    } 
    conn.request("POST" 、「/open-apis/auth/v3/app_access_token/internal」、ペイロード、ヘッダー)
    res = conn.getresponse() 
    data = res。read() 
    # jsonにフォーマットする
    data_dir = json.loads(data.decode("utf-8")) 
    print(data_dir["app_access_token"]) 
    return data_dir['app_access_token'] 

#App_token を取得
#API 呼び出しを使用するのが最善です。返される結果は受信と同じです。多次元テーブル名が判断に使用され、対応するトークンが取得されますが、その API 呼び出しは null を返します。#ここでは、受信
接続の URL の値を使用して、 def 
    get_app_token 
(url) をインターセプトします。 url.split ('/')[-1].split('?')[0] 
    if app_token: 
        print(app_token) 
        return app_token 
    else: 
        return None #Get 

table_id 
#これは URL を通じてインターセプトされるか、または公式 API 
    table_param = query_params。get('テーブル') 
    if table_param:
#受信したシート ID が tableID ではなくサブテーブル名の場合は、API を通じて辞書を取得し、対応する値を取得できます。それを辞書に入れ、キー tableID を通じて対応する値を返します。
def get_table_id(url): 
    parsed_url = urlparse(url) 
    query_params = parse_qs(parsed_url.query)ヘッダー) 
    res = conn.getresponse()

        table_id = table_param[0] 
        print(table_id) 
        return table_id 
    else: 
        print("テーブル パラメータが URL に見つかりません。") 
        return None 
def get_table_idByName(url,tableName,app_id,app_secret): 
    conn = http.client.HTTPSConnection(" open.feishu.cn") 
    payload = '' 

    headers = { 
        'Authorization': 'Bearer '+accss_token(app_id,app_secret) 
    } 
    conn.request("GET", "/open-apis/bitable/v1/apps/" +get_app_token(url)+"/tables?page_size=100"、ペイロード、ヘッダー) 
    data = res.read() 

    data_dir = json。loads(data) 

    table_info_list = data_dir["data"]["items"] 
    table_name = "内容型"
    #print(data_dir["data"]["items"]) 
    table_info_dir = {} 
    table_info_list の table_info の場合: 
        table_info_dir[table_info["name"]] = table_info["table_id"] 
    print(table_info_dir[tableName]) 
    return table_info_dir[ tableName] 


#本地文件への書き込み
def write_data(url,tableName,app_id,app_secret): 
    conn = http.client.HTTPSConnection("open.feishu.cn") 
    payload = '' 
    path = input("捕取データ保存的地址 ") 
    headers = { 
      'Authorization': 'Bearer '+accss_token(app_id,app_secret)  
    }
    conn.request("GET","/open-apis/bitable/v1/apps/"+get_app_token(url)+"/tables/"+get_table_idByName(url,tableName,app_id,app_secret)+"/records?page_size=500"、ペイロード、ヘッダー)
    res = conn.getresponse() 
    data = res.read() 
    #print(data.decode("utf-8")) 
    #print(data['data']) 
    #json に
    フォーマット data_dir=json.loads(data. decode("utf-8")) 
    #データのリスト。その中の各レコードは json に保存されます。
    value_list=data_dir['data']["items"] 
    #出力ビューリスト
    #print(value_list) 
    count=0 
    for kv in value_list: 
        result = "" 
def run():
    入力パラメータ() 
        、kv['fields'].items() の値:
            結果 += f"{キー}: {値}|^|"

        open(path , 'a') をファイルとして使用: 
            # 文件路径は完全な绝对路径 "/Users/username/Documents/output.txt" 
            file.write(result) 
            file.write("\n") 
        print(result) ) 
        count+=1 
    table_info_dir = get_parameters() 
    print(table_info_dir) 
    write_data(table_info_dir['Url'],table_info_dir['Table_name'],table_info_dir['User_appp_id'],table_info_dir['User_app_secret']) 


if __name__ == '__main__' : 
    URL = 'https://hatuxjd72ne.feishu.cn/base/MvPfbLKcsaHSoUsGJdqcSi0Xnde?table=tbldgaotuABaSQUT&view=vewovUyg71' 
    #path = 'D:/migu/data/data2.txt' 
    tableName='page_id' 
    #write_data(url,path,tableName) 
    run()
    #書き込みデータ(t)

おすすめ

転載: blog.csdn.net/m0_71695472/article/details/131856404
おすすめ