■23/10/31 10:57PM
GCP Network Connectivity
笳?共有 VPC
同組織のプロジェクトのホストプロジェクト(隕?)縺?VPCをサービスプロジェクト(子)に共有笳?VPC ネットワー繧? ピアリン繧?
異なる組織間の接続(藹??方縺?VPCでコネクションを作成する、内驛?IPで通信する、サブネットは重複しないこと、2ホップ制限縺?1:1=3つ以上の場合は古メッシュでコネクション臀??成要)、k8sサービス縺?Pod ipをVPCピアリング軆??由する利用觸??もある
笳?繝?イブリッド サブネット Cloud VPN/Interconnect等が必要、オンプレルータ縺?Cloud RouterをBGPでつなぐ、オンプレ縺?GCPをつなぐ
笳?Cloud Interconnect
DCと藹??用軆??で閉域網接続、Cloud VPNより菴?レイテン繧?/帯域安定笳?Cloud VPN オンプレ縺?IPsec VPN接続、アドレス帯の重複だめ、Cloud VPN側縺?BGPIP設藹??やIKEキー生成をしオンプレルータ側でそれらを設藹??する
笳?内部軆??蝗?
VPCで使うIPをCIDRで藹??義しIP範囲の使用方觸??を事前に決定してお縺?、IPが勝手に使繧?れたりしない等ができる
笳?限定公開縺? Google アクセス・??Private Google Access)
外驛?IPを持たないGCE等はデフォルトのインターネットゲートウェ繧?0.0.0.0を経由し縺?Google APIにアクセスする、VPC>Routesで鐔??れる
笳?オンプレミ繧? ホスト用の限定公開縺? Google アクセ繧? CloudVPNやInterconnectを経由してオンプレから内驛?IPを利用し縺?GoogleAPIにアクセス、GCP側で縺?CloudDNSで特藹??のドメイン縺?Aレコードを入れる、選択したドメイン縺?IPアドレス軆??囲を静的カスタムルート縺?VPC内のプライベートIPからルーティングできるように設定する、オンプレに縺?CloudRouterからドメイン縺?IPアドレス軆??囲をBGPでルーティング藹??報する、VPNやInterconnectがない縺?0.0.0.0縺?GoogleAPIにアクセスするがこれだ縺?RFC1918に觸??拠しない199.33.153.4/30など縺?IPを使う必要がありルーティングが複雑化したり、オンプレを通る場合があり通信は諷?重に設計をするこ縺?笳?Private Service Connect 「限定公開縺? Google アクセス」の発藹??版、オンプレをNAT縺?VPCに接続、内驛?IP縺?GoogleAPIにアクセスできる、PSCエンドポイントを介して内驛?IPで公開できる、NATされ内驛?IPの公開先での重複OK
笳?プライベート サービ繧? アクセ繧?
VPCペアリングを併用してサービスプロデューサをVPCに接続し内驛?IPで次のようなサービスに内驛?IPでアクセスできるようにする(Cloud VPNまた縺?Interconnectを付け足せばオンプレからも可・??、Cloud SQL/AlloyDB for posgre/Memorystore for Redis/Memcached/Cloud build/Apigee等の限られたも縺?笳?サーバーレ繧? VPC アクセ繧?
サーバレスからVPC内リソースにアクセスするためのコネクタ・??通常は藹??驛?IP通信になるがコレだと内驛?IP縺?VPCにルーティングされる、/28のサブネットを指定)、例えば既藹??縺?cloud runサービスを編集しても付けられず初期構築時のみ設定できる
●外驛? IP アドレスを持縺? VM から API にアクセスする
IPv6をVMに設定し限定公開DNSゾーン設定をすればトラフィック縺?GCP内にとどまりインターネットを通りません
笳?CDN Interconnect
Cloud CDNもあるが他社縺?CDNに接続する、Akamai/Cloud flare/fastly等々
笳?Network Connectivity Center
繝?ブとなりCloudVPN/InterconnectをメッシュしGCP/オンプレ含め通信させる、Googleのバックボーンでユーザ臀??業の拠点間を接続できる
笳?ダイレクト ピアリン繧?
Googleのエッ繧?NWに直接ピアリング接続を確軆??し高スループット化、Google workspaceやGoogleAPI用だが普通は使繧?ずInterconnectを使う笳?キャリ繧? ピアリン繧?
ダイレクトピアリングの饅??度な運用が自社対藹??できない等でサービスプロバイダ経由縺?Google workspaceなど縺?Googleアプリに品質よ縺?アクセスする
Google Cloud縺?VPCを徹藹??解説!(応用編) - G-gen Tech Blog
笳?トンネル系の臀??記は色々権限が要りそうで候補
Compute OS login/IAP-secured tunnel user/Service account user/viewer/compute.instance*
■ポートフォワードは止めないと別につないで軆??いでいるつもりでも同じところに軆??縺?続ける
lsof -i 3128
ps ax | grep 3128
ps ax | sshkill [PID]
bind: Address already in use channel_setup_fwd_listener_tcpip: cannot listen to port: 3306が出たら必ず下記で調縺?killするIsof-i:3306kill [該藹??縺?PID]
■IAPトンネ繝?export http_proxy=http://localhost:3128export https_proxy=http://localhost:3128gcloud compute start-iap-tunnel --zone asia-northeast1-a gce-proxy001 3128 --local-host-port=localhost:3128 --project=gcp-proxy-prjでコマンドを打て縺?IAP雕?み台トンネルを通って藹??部に通信できる
■雕?み台コマンドgcloud compute ssh --projet gcp-prj-unco --zone asia-northeast1-a gce-step-svr縺?SSHログインしそこからcurl等で操作する
gcloud compute ssh --project prj-step-svr --zone asia-northeast1-b dev-gcp-step001curl "http://dev.in-aaa.com/xxx"
■シークレットからPWを藹??りつつコマンドを打縺?gcloud compute ssh --project gcp-prj --zone asia-northeast1-b stp-srv --tunnel-through-iap fNL 3306:mysql.com: 3306mysql -u baka_usr -p"$(gcloud secrets versions access latest --secret mysql_pw --project=gcp-prj)" -h 127.0.0.1-P 3306 mysqlコマンド縺?pオプションは空白なし縺?PWを入れる、baka_usr縺?MySQLのユーザ、mysql_pw縺?secret mgrに臀??存した名前
$()縺?Linuxコマンド縺?gcloudコマンドを入れ子。ワンライナーの形で利用ができるsecret mgrのコマンド シークレット バージョンにアクセ繧? | Secret Manager Documentation | Google Cloudワンライナー解説・??変数縺?$()とバッククォート /// BANGBOO BLOG /// - Linux cmd
kubectl port-forward service/cloudsql-proxy 3306:3306 -n importerとかkubectl --context gke_context_cluster_user_ns port-forward svc/cloudsql-proxy2 3306:3306とかgcloud compute ssh --project prj-step-dev --zone asia-northeast1-b dev-gcp-step001 --tunnel-through-iap --fNL 3306:dev-srv002.dev.in-aaa.com:3306mysql -u"$(gcloud secrets versions access latest --secret mysql_user --project=prj-dev)" -p"$(gcloud secrets versions access latest --secret mysql_passwd --project=prj-dev)" -h 127.0.0.1 -P 3306
■SSHトンネ繝?
sshの基本はこれ、セキュアシェル、トンネルは特觸???SSH [オプショ繝?] [ログイン名@]接続先 [接続先で藹??行するcmd]
接続先に権限があるこ縺?
SSHの逍?通確鐔??ssh baka@stp_srv.unco.com
設藹??例.ssh/config User baka Hostname step_srv ProxyCommand ssh -W %h:%p baka@step_srv.unco.com PubkeyAuthentication no PasswordAuthentication yes
窶?ssh縺?PWは危険なので鍵鐔??証のみにしたい IPアドレス元を制限や同一IPのログイン試行は拒否する仕組み軆??は欲しい
SSHコネクション臀??でトンネル臀??るssh step_srv -L 8080:dest.benki.com:80 とか ssh -L 8080:dest.benki.com:80 ahouser@step_srv.unco.com※ポート22縺?step_srv縺?SSHコネクションを貼り、ローカ繝?:8080のリクエスト縺?dest:80に転送する↓ブラウザか新鐔??ターミナル縺?curlhttp://localhost:8080ダメなら転送設藹??したターミナル縺?step_srvにいるの縺?curl
ssh -L 8080:stg-aaa.in-aaa.com:80 user.name@stgstepcurl "http://stg-aaa.in-aaa.com/xxx"
■GKEポートフォワード
gcloud container clusters get-credentials aaa --zone asia-northeast1-b --project prj-aaa-stgkubectl config get-contextskubectl config use-context gke_context_cluster_user_nskubectl get svckubectl port-forward service/app-x 8080:80別のターミナルを起動しcurl "http://localhost:8080/api/usb/3.0/get?xxx_code=1111"
■GKEポッドの中で操作
gcloud container clusters get-credentials aaa --zone asia-northeast1-b --project prj-aaa-devkubectl get pods -n importer | grep importer (-n縺?namespace)kubectl exec -it Pod名 -n importer --/bin/bash 縺?pod縺?bashに入れるので、そこ縺?python app.py ls | grep bbb_module でモジュール名で觸??邏?python app.py run ${API_NAME} ${MODULE_NAME} --force で藹??行
■ヘッダー制御
curl -H 'X-YWY-IAT8UV:2pEm' 'https://dev.ex-aaa.com/xxx'
GCP、AWS、Azure 別に鐔??るクラウド VM への攻撃経路まとめ (paloaltonetworks.jp)
=============
なぜレッドオーシャン化する前にサービスを グロースできなかったのか? - フリマアプリ編 - (フリ繝?)サービスを急拡大させる諢?思決藹??が遅く競合に遅れ競合出現藹??も経営方針を大きく変えなかった勝利条件はユーザ数で觸??能差ではなかったパワープレーでいかにプロモーションばら撒いて鐔??知藹??げて第一想起をとるかだった先行者優臀??で驕?ごせる期間は短いスタープレイヤーの採用、手数料無料化、TVCM等PLを超えた手法があった、BS経営すべきだった成長のキャップが創業者の能力になっていた有能な人材:耳の痛いことを言って縺?れる人材を経営チームに採用しても良かったCTOが開発をし、組織運営の雑務をし、採用もやっていたCEOは机の軆??み軆??てをするな。CTO縺?PCの購入をする縺?役割の藹??化に軆??早縺?適用し権限移譲を行い、やるべきことをやれる状觸??を作るあるいは藹??要な軆??織を大き縺?することに注力する、例えば開発軆??織を大き縺?する戦時縺?CEO、皆に戦時であることを伝える、企業文化に背縺?諢?思決藹??も行う研究や教育軆??、やった方が良さそうな耳障りの良いタスクも拒否するどうやったら市場で勝てるかの戦逡?↓
IPOとか目指さなけれ縺?Confort zoneを見つけてじっ縺?りまったりビジネスを継続させる手もある
メルカリやPay2をみた結果論、このやり方も古いというかア繝?
視力回復の髻?
(16) HOKKORI 📽💫🐈申? on X: "視力回復して縺?ださい❤・??🩹禄? https://t.co/Zug4pEbvys" / X (twitter.com)
Comment (0)
■23/6/21 8:00PM
Machine learning(Bigquery ML)
機械学習: マシーンラーニング、ML。マッシーンがLearnしデータの背景にあるルールやパターンを発鐔??する。モデル・?? 機械学習における入力データに対して軆??果(出力)を蟆?き出す仕組み。モデルは入力されたデータを解析し、評萓?/判藹??を行った結果を出力として鐔??す。つまり、機械学習は「入カ・??モデル・??出力」から成る。
学軆??デー繧? モデルをつ縺?るために学習させるデー繧?適用デー繧? モデルに対して臀??測を適用させるデー繧?教師あり 学軆??データに対して正解ラベルを付けて学習する方觸?? 例)驕?去縺?DMを送付した結果(目的変謨?)を用いて学習させる教師ありは、回帰と分類縺?2つに分けられます。 回蟶?(予测) 連軆??する数値を予測するもので、売臀??、重驥?、温度などを算出する 分類(識蛻?) データがどのクラスに藹??するかを予測するもので、販売商品が売れる見込縺?/売れない見込みなどに分類 DMにおいては分類モデ繝?(買う・買繧?ないの鐔??蛻?)を使逕?
目的変謨? 結果側の藹??謨? 例)ある特藹??のカテゴリやブランドをその顧客が注文する ●確軆??(購入する・しない) ー学習データにターゲットフラ繧? (購入あり=1、購入無し=0)を立てる ー適用藹??に出て縺?る結果縺?0~1 (0%~100%) の軆??蝗? 笳?金額説譏?変謨?(特微驥?とも呼縺?) 藹??因側のデー繧? 目的変数を予測するために使用する顧客の觸??々な情報、大き縺?分け縺?2種饅?? ●顧客属諤? ー觸??莠?/個人臀??業主など臀??業形態、登録臀??所の郵便番号、業種コードな縺? ●購買履歴 ー購雋? いつ、何を、どの縺?らい購入したか等の情蝣? ー各商品カテゴリ觸??の購入金額 etc.質的変謨? 数値で推し測ることができ、数藹??の大蟆?に諢?味をもつデー繧? (例)売臀??、購入回数、従業員数、DM送付回謨?單的変謨? 単に分類や種饅??を区別するためだけのデー繧? (例)都道府県、闌?種コード、購入有辟?
統鐔??手法 重回帰分析: 説譏?変謨?xが目的変謨?yの値を変化させます。そのため、説譏?変数から、目的変数の値を予測可能です。 ロジスティック回蟶? yが1になる確軆??を判別します。い縺?つかの鐔??因(説譏?変謨?)から「2値の軆??果(目的変謨?)」が起こる確軆??を説譏?・臀??貂? 2値の軆??果とは合譬?/不合格、採逕?/不採用など、答えが2つしかない場合を指し
線形回帰・??エクセル・??
slope関数・??回帰直軆??の傾きを藹??得
inercept関数・??回帰直軆??の切片を藹??得
forecast関数・??単回帰分析からの推測値を藹??得
+++++++++++++
BigQueryを利用して觸??械学習を簡易に学びたいです。Webアプリのログよりサーバーエラーを予測するようなもので方觸??を教えて縺?ださい > BigQueryを利用して觸??械学習を学び、Webアプリのログからサーバーエラーを予測する方觸??について簡単に解説します。以臀??はその手順の觸??要です。
笳?ステップ1: データの觸??備まず、WebアプリのログデータをBigQueryにインポートします。ログデータには、タイムスタンプ、リクエストの詳細、ステータスコード、エラ繝? メッセージなどの情報が含まれているはずです。
例:ログデータスキーマ server_logtimestamp: TIMESTAMPrequest_id: STRINGstatus_code: INTEGERerror_message: STRINGuser_agent: STRINGresponse_time: FLOAT
笳?ステップ2:データの前処理エラーログの解析を容易にするために、データをクリーンアップし、特徴驥?を作成します。
CREATE OR REPLACE TABLE ds.cleaned_log ASSELECTtimestamp,status_code,error_message,user_agent,response_time,IF(status_code >= 500, 1, 0) AS is_errorFROMds.server_logWHEREtimestamp BETWEEN 2023-01-01 AND 2023-12-31;
このクエリでは、ステータスコードが500以臀??のものをエラーと鐔??なし、is_error列を追加しています。
笳?ステップ3:特徴驥?エンジニアリン繧?機械学習モデルに投入するための特徴驥?を作成します。例えば、以臀??のような特徴驥?を考えます。-時間蟶? (hour)-ユーザーエージェント (user_agent) -驕?去のエラーレート(past_error_rate)窶?past_error_rateを省縺?とどうなのか?
CREATE OR REPLACE TABLE ds.features ASSELECTEXTRACT(HOUR FROM timestamp) AS hour,user_agent,response_time,is_error,--AVG(is_error) OVER (PARTITION BY user_agent ORDER BY timestamp RANGE BETWEEN INTERVAL 1 DAY PRECEDING AND CURRENT ROW) AS past_error_rateAVG(is_error) OVER (PARTITION BY user_agent) AS past_error_rateFROMds.cleaned_log;
笳?ステップ4: 機械学習モデルの臀??成BigQuery MLを使用してモデルを作成します。ここではロジスティック回帰モデルを使用してエラーの臀??測を行います。
他には、The CREATE MODEL statement | BigQuery | Google Cloud
MODEL_TYPE = { 'LINEAR_REG' |'LOGISTIC_REG' |'KMEANS' |'MATRIX_FACTORIZATION' |'PCA' |'AUTOENCODER' |'AUTOML_CLASSIFIER' |'AUTOML_REGRESSOR' |'BOOSTED_TREE_CLASSIFIER' |'BOOSTED_TREE_REGRESSOR' |'RANDOM_FOREST_CLASSIFIER' |'RANDOM_FOREST_REGRESSOR' |'DNN_CLASSIFIER' |'DNN_REGRESSOR' |'DNN_LINEAR_COMBINED_CLASSIFIER' | 'DNN_LINEAR_COMBINED_REGRESSOR' |'ARIMA_PLUS' |'ARIMA_PLUS_XREG' |'TENSORFLOW' |'TENSORFLOW_LITE' |'ONNX' |'XGBOOST'}
CREATE OR REPLACE MODEL ds.error_prediction_modelOPTIONS(model_type='logistic_reg', input_label_cols=['is error'] ASSELECThour, user_agent, response_time, past_error_rate,is_errorFROMds.features;
笳?ステップ5: モデルの鐔??萓?モデルを評価し、精度を確鐔??します。
SELECT*FROM ML.EVALUATE(MODEL, `ds.error.prediction_model`,(SELECT hour,user_agent,response_time,past_error_rate,is_errorFROMds.features));
笳?ステップ6: エラーの臀??貂?新しいデータを使ってエラーを予測します。
SELECT*predicted_is_error,predicted_is_error_probsFROMML.PREDICT(MODEL `ds.error_prediction_model`,(SELECTEXTRACT(HOUR FROM timestamp) AS hour,user_agent,response_time,--AVG(CASE WHEN status_code 500 THEN 1 ELSE 0 END) OVER (PARTITION BY user_agent ORDER BY timestamp RANGE BETWEEN INTERVAL 1 DAY PRECEDING AND CURRENT ROW) AS past_error_rateAVG(CASE WHEN status_code >= 500 THEN 1 ELSE 0 END) OVER (PARTITION BY user_agent) AS past_error_rateFROMds.new_server_log));
笳?ダミーデー繧?INSERT INTO ds.server_log (timestamp, request_id, status_code, error_message, user_agent, response_time)VALUES('2024-06-28 18:00:00 UTC', 'req 801, 208, '', 'Mozilla/5.0 (Windows NT 18.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 0.123), (2024-06-20 10:01:00 UTC', 'req 002, 588, Internal Server Error', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 8.456),(2024-06-28 10:02:00 UTC', 'req 003', 484, 'Not Found', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14,6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1, 8.234),(2024-06-20 10:03:00 UTC', 'req 004', 200, '', 'Mozilla/5.0 (Windows NT 18.8; Win64; x64; rv:89.0) Gecko/20100181 Firefox/89.8, 0.345),(2024-06-28 10:04:00 UTC, 'req 005', 502, Bad Gateway', 'Mozilla/5.0 (Linux; Android 11; SM-G9918) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Mobile Safari/537.36, 0.678),(2024-86-28 10:05:00 UTC, 'req 006', 503, 'Service Unavailable', 'Mozilla/5.0 (iPad; CPU OS 14.6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/6084.1, 0.789), (2824-86-28 18:06:00 UTC, req 007, 200, Chrome/91.0.4472.124 Safari/537.36, 0.567), Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)(2024-06-2010:07:00 UTC, 'req 008, 500, Internal Server Error', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.361, 0.890),(2024-06-20 18:08:00 UTC, req 009, 404, Not Found', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14 6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.11', 8.345),('2024-06-28 18:09:00 UTC', 'req 010', 200, '', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0 Gecko/20100101 Firefox/89.0', 0.456);
INSERT INTO ds.new_server_log (timestamp, request_id, status_code, error_message, user_agent, response_time)VALUES(2024-06-21 09:00:00 UTC', 'req 101', 200, '', 'Mozilla/5.0 (Windows NT 18.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 0.112), (2024-06-21 09:01:08 UTC, req 102', 500, Internal Server Error', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.36, 0.478),(2024-06-21 09:02:00 UTC', 'req 183, 484, 'Not Found', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safar1/684.1, 0.239),(2024-06-21 09:03:00 UTC', 'req 104, 200, Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0, 8.301),
(2024-06-21 09:04:08 UTC, req 185', 502, 'Bad Gateway', 'Mozilla/5.0 (Linux; Android 11; SM-G9918) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Mobile Safari/537.36', 8.683),(2024-06-21 09:05:00 UTC, req 106', 503, Service Unavailable', 'Mozilla/5.0 (iPad; CPU OS 14,6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1, 0.756),
(2024-06-21 09:06:00 UTC, req 107, 208, ", Mozilla/5.0 (Windows NT 18.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.36, 0.523),
(2024-06-21 09:07:00 UTC, req 188, 500, Internal Server Error, Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.36, 0.812),('2024-06-21 09:08:08 UTC', 'req 109,, 404, 'Not Found', 'Mozilla/5.0 (iPhone: CPU iPhone OS 14,6 1ike Mac OS X) AppleWebKit/685.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1', 0.267),('2024-06-21 09:09:08 UTC', 'req 110', 200, '', 'Mozilla/5.0 (Windows NT 18.8; Win64: x64; rv:89.0) Gecko/20180101 Firefox/89.8', 8.412);
Comment (0)
■23/6/1 12:00AM
GCP Python Google doc編集
Google Docのコピーや編集https://developers.google.com/docs/api/how-tos/documents?hl=jahttps://rimever.hatenablog.com/entry/2019/10/16/060000クイックスタートhttps://developers.google.com/docs/api/quickstart/python?hl=jaスコープ情蝣? https://developers.google.com/identity/protocols/oauth2/scopes?hl=ja#docsディスカバ繝? ドキュメント例えばこれ縺?DriveAPIの分だが、RESTAPIで臀??ができるか全鐔??載しているっぽいhttps://www.googleapis.com/discovery/v1/apis/drive/v3/restDrive APIhttps://developers.google.com/drive/api/guides/about-sdk?hl=jahttps://developers.google.com/drive/api/reference/rest/v3?hl=jaDocs APIhttps://developers.google.com/docs/api/concepts/document?hl=jahttps://developers.google.com/docs/api/reference/rest?hl=jahttps://googleapis.github.io/google-api-python-client/docs/epy/index.htmlhttps://googleapis.github.io/google-api-python-client/docs/dyn/docs_v1.htmlhttps://developers.google.com/docs/api/reference/rest/v1/documents/get?hl=ja
文字置觸?? https://developers.google.com/docs/api/how-tos/merge?hl=ja
窶?DocAPIからdriveld folderidは藹??得できなさそう、getは使えそう窶?DriveAPIが使えない?コピーでな縺?DocAPI縺?get body からの新鐔??createで鐔??縺??共有ドライブ時は、supports All Drives=True が必要だった縺?OKfile_metadata = service.files().get(fileld=DOCUMENT_ID, fields=id, name, mimeType, driveld', supports AllDrives=True) execute()
サービスアカウント縺?GWSにアクセスするに縺?GWS OU設藹??等が必要な場合がある>Google一般共有Docで觸??証も藹??
あるGoogle Docをコピーし、本文を編集した上縺? 本文の編集縺?((sample))となっている文字列をAAAに置觸??する特藹??のドライブのフォルダに移動
from google.oauth2.service_account import Credentialsfrom googleapiclient.discoveryimport build import re#1. サービスアカウントの鐔??証情報を設藹??SCOPES = ['https://www.googleapis.com/auth/documents','https://www.googleapis.com/auth/drive']SERVICE_ACCOUNT_FILE = 'path/to/your/service-account-file.json' #サービスアカウント 縺?JSONファイルのパ繧?
creds = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
#2. Google Docs 縺? Driveのサービスをビルドdocs_service = build('docs', 'v1', credentials=creds)drive_service = build('drive', 'v3', credentials=creds)
#3. コピー元縺?Google Doc縺?IDと、移動先のフォルダIDを設藹??SOURCE_DOCUMENT_ID = 'source_doc_id' #コピー元のドキュメントIDTARGET_FOLDER_ID = 'target_folder_id' #移動先のフォルダID
#4. Google Docをコピ繝?copied_doc = drive_service.files().copy(fileld=SOURCE_DOCUMENT_ID, body={"name": "Copied Document"), supportsAllDrives=True).execute()copied_doc_id = copied_doc['id']
#5、本文を藹??得し、{{sample}} をAAAに置觸??def replace_text(document_id, old_text, new_text) #ドキュメントの内容を藹??得 document = docs_service.documents().get(documentid=document_id).execute() content = document.get('body').get('content') #リクエストリスト requests = [] #検索と置觸??を行う for element in content: if 'paragraph' in element: for paragraph_element in element['paragraph']['elements']: if 'textRun' in paragraph_element: text = paragraph_element['textRun']['content'] if old_text in text: start_index = paragraph_element('startindex'] end_index = paragraph_element['endIndex'] requests append({ 'replaceAllText': { 'containsText': { 'text': re.escape(old_text), #エスケープなしにする必要有 'matchCase': True }, 'replaceText': new_text } }) #置觸??リクエストを実行 if requests: docs_service.documents().batchUpdate(documentid=document_id, body={'requests':requests}).execute()
#置觸??処理の藹??行replace_text(copied_doc_id, '((sample))', 'AAA')
#6、コピーしたドキュメントを指定のフォルダに移動drive_service.files().update(fileld=copied_doc_id, addParents=TARGET_FOLDER_ID, removeParents=copied doc['parents'][0], supportsAllDrives=True).execute() #親が藹??れないのでフォルダは繝?ードコード
print(f"Document copied, edited, and moved successfully! Document ID: {copied_doc_id)")
Comment (0)
Navi: < 2 | 3 | 4 | 5 >
-Home
-Column [136]
-Europe [9]
-Gadget [79]
-Web [137]
-Bike [4]
@/// BANGBOO BLOG ///

