From fb24195233059f1cfe935cef329db2896d218423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=BA=90?= Date: Tue, 8 Sep 2026 22:47:54 +0800 Subject: [PATCH] feat: add MediaGo channel (backfill 08-20~09-06, 30 records) + daily auto-update --- .gitignore | 4 + bigo_token.json | 2 +- mtg_data.json | 512 ++++++++++++++++++++++++++++++++++++++++++++++++ update.sh | 89 +++++++++ 4 files changed, 606 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 863a207..0c0468f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,7 @@ backfill.log bigo_test.py bigo_refresh.py bigo_backfill.py +mediago_probe.py +mediago_backfill.py +mediago_matches.json +mediago_backfill.log diff --git a/bigo_token.json b/bigo_token.json index a5253bf..dc58d43 100644 --- a/bigo_token.json +++ b/bigo_token.json @@ -1 +1 @@ -{"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlA0SkRvOUx1emlkeUVoZlF6SG1qbHRKR0R5bC81UXNKVzBZMDhkTmkrTHM9In0.eyJhdWQiOlsib3BlbmFwaSJdLCJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbInJlYWQiXSwiZXhwIjoxNzg4OTQyNDA1LCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjYzOTA5OTk5LTcwNDYtNDY1OC1iMzI5LTFhZWUyOGRmNTEyYiIsImNsaWVudF9pZCI6IjI2MDMyNTY0NDIyMTIwNDA2MTAwNDgifQ.Wj1KeLNE5DUXBkVhIYcFbVUaXevhy6g7fydyHennSmvKCBFFtZrsrq81EaAKJeST0fJdHVrfTj47wUAa_Z3VEQtCD7n6io50qo9o3VYjY6WetLlNWec--nYFiDoYbVN1vFjaPxi44BxUn32rIZScxQvZEhMxyxthn67KLnmlQi9_1smS5thnKdNUryC7iN_FmD4TwvD7dr4lU4P2VQJXyUDABFP7yXIf_zrhg22pn37zMIpBx9YDMxnhgZbxx-EiJ_kw_r3ANHvgN9Bl0QkXbj4pRLpeB0PLX0pjo9DKYZib4fSTP9Q6S_wq2eDd7_pLWYuxf8gc9bEV2SvnJGxC1w", "token_type": "bearer", "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlA0SkRvOUx1emlkeUVoZlF6SG1qbHRKR0R5bC81UXNKVzBZMDhkTmkrTHM9In0.eyJhdWQiOlsib3BlbmFwaSJdLCJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbInJlYWQiXSwiYXRpIjoiNjM5MDk5OTktNzA0Ni00NjU4LWIzMjktMWFlZTI4ZGY1MTJiIiwiZXhwIjoxNzkxNDQ4MDA1LCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjYxM2NlYjY2LWY4YmQtNGE0MS1hNDVjLTkyMzFiYTEzZTU2MyIsImNsaWVudF9pZCI6IjI2MDMyNTY0NDIyMTIwNDA2MTAwNDgifQ.N9-uw7G1tukQyVB0fRdvXWRC4s5o2BYzD1aUDX20XpITWJE4HKLICUkkVQFTL-RUy0Kpup14GcbpLXyE_W6vb9CJmvxsHQ8mdoDYe-QxOOeKGad2mmwNLl1UR8aIAXMs7GQE2yUfUC30FQnM8rC5fHXYWj00C-Q-YQ0xRgvK_p3SNpz9QIkoVp7JeGCpNT0cFVgMvroU5QC6KIUPILbHeYlrMYUzSOiD0CBvQkqfTusPXRj_qfW0CeMHFt0rizLaUKlTx1oXZQ9AtgSss28GSNXuPumTtG87LCIngBLWzdnB-jHepjfVhXg4k8hbE8RMhf2BYJ1lXAtE2sHUyDJIIA", "expires_in": 86399, "scope": "read", "jti": "63909999-7046-4658-b329-1aee28df512b"} \ No newline at end of file +{"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlA0SkRvOUx1emlkeUVoZlF6SG1qbHRKR0R5bC81UXNKVzBZMDhkTmkrTHM9In0.eyJhdWQiOlsib3BlbmFwaSJdLCJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbInJlYWQiXSwiZXhwIjoxNzg4OTY1MTI4LCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjgyMzIyYTFkLTFmZTQtNDA2Ny05MTM1LTg2M2ZlZjAzMWUxNCIsImNsaWVudF9pZCI6IjI2MDMyNTY0NDIyMTIwNDA2MTAwNDgifQ.I0EQigC2GTHdVKxiCdfXEiq7lEppIly53soQkvcc66AXfYHAaRwr41gFdpjR0pudI7lUbl9_sMzRq3IHIQs4LUmy9p3Zqx9YW9WV6GTAiw3HL4UEt92-j2wxtqEGus21NejP42IHU155lP_RQC726PX5Jjy_mf4cAlzj0o0MxIabTgP2jntT6Y3tpY9Xq851-t2bFflRxGddhjJKikqJbfT2P85eXcnmv3rWVlcxVQAkz0_wctKVGy27RHliQL7gkimjBpOQdx07sVWPqiBLL0aNHHrMvbF2E9V4XtH8uhNlyQy55yo1VtvCSd8TTvtbKhySnoAuQbfQH9UzP9AZDQ", "token_type": "bearer", "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlA0SkRvOUx1emlkeUVoZlF6SG1qbHRKR0R5bC81UXNKVzBZMDhkTmkrTHM9In0.eyJhdWQiOlsib3BlbmFwaSJdLCJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbInJlYWQiXSwiYXRpIjoiODIzMjJhMWQtMWZlNC00MDY3LTkxMzUtODYzZmVmMDMxZTE0IiwiZXhwIjoxNzkxNDcwNzI4LCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6ImI5MmY1NDg0LTY1NWMtNGQ1Yi1hMjRiLTZiZDFlNTk0NzM0NCIsImNsaWVudF9pZCI6IjI2MDMyNTY0NDIyMTIwNDA2MTAwNDgifQ.Kf-bBcgOYd5ZyL8VMu1un0lqJGB4zjA8YvTj-riZ7BKdZH49cEwnk6JCeqkgSXm1tSUWwnmW89Og1EkteiUMcJNtXHDejehGPdtKCsqgZPtL06O_flbbdLW8SlBEarvLUNxMj1_ELXTJ9kdZPUVVGig7oXSzLah2B8MISejnyD9LF_iGZL6Rq8NE0YlJgqZRjXN2Js7qUN6TWSGBpcNBI0Lh5iDFqVVojejuzatTLkOUWxKhBX40LteQgYjB_JD1zhAxtjtUGqZWy17H8qHhDTW9dPP-9tsGFCKGuRxRvEaPFExOi7OacT9hBdpZ65E_C0mZ1k0BLqqH26kUabVrQg", "expires_in": 86399, "scope": "read", "jti": "82322a1d-1fe4-4067-9135-863fef031e14"} \ No newline at end of file diff --git a/mtg_data.json b/mtg_data.json index eee1e61..771f59d 100644 --- a/mtg_data.json +++ b/mtg_data.json @@ -2079,6 +2079,22 @@ "cvr": 0.0, "spend": 0.0 }, + { + "date": "2026-08-20", + "channel": "MediaGo", + "campid": "91546637", + "offer_name": "91546637_IGG_RU_20260820", + "product": "IGG (Lords Mobile)", + "pkg": "com.igg.android.lordsmobile", + "location": "RU", + "bid_type": "", + "impression": 38616, + "clicks": 369, + "conversions": 2, + "ctr": 0.00956, + "cvr": 0.00542, + "spend": 1.58 + }, { "date": "2026-08-20", "channel": "Mintegral", @@ -2207,6 +2223,22 @@ "cvr": 0.0, "spend": 0.0 }, + { + "date": "2026-08-21", + "channel": "MediaGo", + "campid": "91546637", + "offer_name": "91546637_IGG_RU_20260820", + "product": "IGG (Lords Mobile)", + "pkg": "com.igg.android.lordsmobile", + "location": "RU", + "bid_type": "", + "impression": 384, + "clicks": 3, + "conversions": 0, + "ctr": 0.00781, + "cvr": 0.0, + "spend": 0.05 + }, { "date": "2026-08-21", "channel": "Mintegral", @@ -2783,6 +2815,54 @@ "cvr": 0.0225, "spend": 4.61 }, + { + "date": "2026-08-26", + "channel": "MediaGo", + "campid": "91546637", + "offer_name": "91546637_IGG_RU_20260820", + "product": "IGG (Lords Mobile)", + "pkg": "com.igg.android.lordsmobile", + "location": "RU", + "bid_type": "", + "impression": 15914, + "clicks": 5954, + "conversions": 46, + "ctr": 0.37414, + "cvr": 0.00773, + "spend": 30.15 + }, + { + "date": "2026-08-26", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 56, + "clicks": 0, + "conversions": 0, + "ctr": 0.0, + "cvr": 0.0, + "spend": 0.0 + }, + { + "date": "2026-08-26", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 10, + "clicks": 0, + "conversions": 0, + "ctr": 0.0, + "cvr": 0.0, + "spend": 0.0 + }, { "date": "2026-08-26", "channel": "Mintegral", @@ -2927,6 +3007,54 @@ "cvr": 0.0343, "spend": 24.68 }, + { + "date": "2026-08-27", + "channel": "MediaGo", + "campid": "91546637", + "offer_name": "91546637_IGG_RU_20260820", + "product": "IGG (Lords Mobile)", + "pkg": "com.igg.android.lordsmobile", + "location": "RU", + "bid_type": "", + "impression": 24500, + "clicks": 4215, + "conversions": 91, + "ctr": 0.17204, + "cvr": 0.02159, + "spend": 19.55 + }, + { + "date": "2026-08-27", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 131, + "clicks": 0, + "conversions": 0, + "ctr": 0.0, + "cvr": 0.0, + "spend": 0.0 + }, + { + "date": "2026-08-27", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 17, + "clicks": 0, + "conversions": 0, + "ctr": 0.0, + "cvr": 0.0, + "spend": 0.0 + }, { "date": "2026-08-27", "channel": "Mintegral", @@ -3039,6 +3167,38 @@ "cvr": 0.0568, "spend": 24.31 }, + { + "date": "2026-08-28", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 121, + "clicks": 1, + "conversions": 0, + "ctr": 0.00826, + "cvr": 0.0, + "spend": 0.01 + }, + { + "date": "2026-08-28", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 21, + "clicks": 0, + "conversions": 0, + "ctr": 0.0, + "cvr": 0.0, + "spend": 0.0 + }, { "date": "2026-08-28", "channel": "Mintegral", @@ -3183,6 +3343,38 @@ "cvr": 0.0909, "spend": 23.9 }, + { + "date": "2026-08-29", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 126, + "clicks": 2, + "conversions": 0, + "ctr": 0.01587, + "cvr": 0.0, + "spend": 0.01 + }, + { + "date": "2026-08-29", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 15, + "clicks": 0, + "conversions": 0, + "ctr": 0.0, + "cvr": 0.0, + "spend": 0.0 + }, { "date": "2026-08-29", "channel": "Mintegral", @@ -3295,6 +3487,38 @@ "cvr": 0.0543, "spend": 24.73 }, + { + "date": "2026-08-30", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 148, + "clicks": 3, + "conversions": 0, + "ctr": 0.02027, + "cvr": 0.0, + "spend": 0.01 + }, + { + "date": "2026-08-30", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 19, + "clicks": 1, + "conversions": 0, + "ctr": 0.05263, + "cvr": 0.0, + "spend": 0.02 + }, { "date": "2026-08-30", "channel": "Mintegral", @@ -3439,6 +3663,38 @@ "cvr": 0.0288, "spend": 23.74 }, + { + "date": "2026-08-31", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 108, + "clicks": 0, + "conversions": 0, + "ctr": 0.0, + "cvr": 0.0, + "spend": 0.0 + }, + { + "date": "2026-08-31", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 15, + "clicks": 0, + "conversions": 0, + "ctr": 0.0, + "cvr": 0.0, + "spend": 0.0 + }, { "date": "2026-08-31", "channel": "Mintegral", @@ -3551,6 +3807,38 @@ "cvr": 0.0093, "spend": 16.05 }, + { + "date": "2026-09-01", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 464, + "clicks": 218, + "conversions": 0, + "ctr": 0.46983, + "cvr": 0.0, + "spend": 6.35 + }, + { + "date": "2026-09-01", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 40, + "clicks": 7, + "conversions": 0, + "ctr": 0.175, + "cvr": 0.0, + "spend": 0.18 + }, { "date": "2026-09-01", "channel": "Mintegral", @@ -3631,6 +3919,54 @@ "cvr": 0.0, "spend": 0.0 }, + { + "date": "2026-09-02", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 1498, + "clicks": 849, + "conversions": 0, + "ctr": 0.56676, + "cvr": 0.0, + "spend": 27.24 + }, + { + "date": "2026-09-02", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 90, + "clicks": 48, + "conversions": 0, + "ctr": 0.53333, + "cvr": 0.0, + "spend": 1.38 + }, + { + "date": "2026-09-02", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "CN", + "bid_type": "", + "impression": 3, + "clicks": 3, + "conversions": 0, + "ctr": 1.0, + "cvr": 0.0, + "spend": 0.01 + }, { "date": "2026-09-02", "channel": "Mintegral", @@ -3743,6 +4079,54 @@ "cvr": 0.0, "spend": 0.0 }, + { + "date": "2026-09-03", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 596, + "clicks": 312, + "conversions": 0, + "ctr": 0.52349, + "cvr": 0.0, + "spend": 3.3 + }, + { + "date": "2026-09-03", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 60, + "clicks": 11, + "conversions": 0, + "ctr": 0.18333, + "cvr": 0.0, + "spend": 0.25 + }, + { + "date": "2026-09-03", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "CN", + "bid_type": "", + "impression": 2, + "clicks": 1, + "conversions": 0, + "ctr": 0.5, + "cvr": 0.0, + "spend": 0.01 + }, { "date": "2026-09-03", "channel": "Mintegral", @@ -3871,6 +4255,38 @@ "cvr": 0.0, "spend": 0.0 }, + { + "date": "2026-09-04", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 129, + "clicks": 25, + "conversions": 0, + "ctr": 0.1938, + "cvr": 0.0, + "spend": 0.09 + }, + { + "date": "2026-09-04", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 38, + "clicks": 14, + "conversions": 0, + "ctr": 0.36842, + "cvr": 0.0, + "spend": 0.57 + }, { "date": "2026-09-04", "channel": "Mintegral", @@ -3967,6 +4383,38 @@ "cvr": 0.0, "spend": 0.0 }, + { + "date": "2026-09-05", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 118, + "clicks": 19, + "conversions": 0, + "ctr": 0.16102, + "cvr": 0.0, + "spend": 0.04 + }, + { + "date": "2026-09-05", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 79, + "clicks": 33, + "conversions": 0, + "ctr": 0.41772, + "cvr": 0.0, + "spend": 0.48 + }, { "date": "2026-09-05", "channel": "Mintegral", @@ -4079,6 +4527,38 @@ "cvr": 0.0, "spend": 0.0 }, + { + "date": "2026-09-06", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 144, + "clicks": 80, + "conversions": 0, + "ctr": 0.55556, + "cvr": 0.0, + "spend": 1.21 + }, + { + "date": "2026-09-06", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 120, + "clicks": 36, + "conversions": 0, + "ctr": 0.3, + "cvr": 0.0, + "spend": 0.06 + }, { "date": "2026-09-06", "channel": "Mintegral", @@ -4175,6 +4655,38 @@ "cvr": 0.0, "spend": 0.0 }, + { + "date": "2026-09-07", + "channel": "MediaGo", + "campid": "91546639", + "offer_name": "91546639_xczyw_TW_260820", + "product": "灵犀互动", + "pkg": "com.sialiagames.xczyw.gp.tw", + "location": "TW", + "bid_type": "", + "impression": 39, + "clicks": 21, + "conversions": 0, + "ctr": 0.53846, + "cvr": 0.0, + "spend": 0.39 + }, + { + "date": "2026-09-07", + "channel": "MediaGo", + "campid": "91546640", + "offer_name": "91546640_xczyw_HK_260820", + "product": "灵犀互动", + "pkg": "com.qookkagames.xczyw.gp.hk", + "location": "HK", + "bid_type": "", + "impression": 31, + "clicks": 4, + "conversions": 0, + "ctr": 0.12903, + "cvr": 0.0, + "spend": 0.0 + }, { "date": "2026-09-07", "channel": "Mintegral", diff --git a/update.sh b/update.sh index c8a165d..8338976 100755 --- a/update.sh +++ b/update.sh @@ -190,4 +190,93 @@ json.dump(out, open("mtg_data.json","w"), ensure_ascii=False, indent=2) print(f"[update] Bigo 合并后共 {len(out)} 条,已写入 mtg_data.json") PYEOF +# ============ MediaGo 每日更新 ============ +python3 - <<'PYEOF' +import json, os, time, urllib.request, urllib.parse, urllib.error +from datetime import date, timedelta + +AUTH_URL = "https://api.mediago.com/manage/api/v1/access_token" +COST_URL = "https://api.mediago.com/report/api/v1/cost/daily" +TOKENS = [ + "YWNjb3VundF8zmu5wjlv1vcRwbpdqaCugRvQKslUg9kQH4XnrNXefCbtGDcC", + "YWNjb3VundF8XrY8TwaXlX6pJDLnmfqmGgZT654Hh6rBRH9Cj9GzPXpO48BW", + "YWNjb3VundF89iFLKQQHlvwxnhVbWvchTAz009Zcjw7jTkOPzCDC3oLK0RGO", + "YWNjb3VundF815Lb3KpFWB8pnajnDZwL8Aw0YHpquAqUPWl78NKSaSigRBsY", + "YWNjb3VundF8SKbXp3ceGoHmS9SyMBleK2bIglGThBhoHly8yPoYOP8jZtww", + "YWNjb3VundF80DXnMfSwD4LWsV1hVVSA2j5FZQsWMSTQbJ6lTZIUhhrQZ9c6", + "YWNjb3VundF8gK0LuXHCZkNyC4R14Adayu4j1xnNJMzxvu1hokiwUPNOPJxS", + "YWNjb3VundF82rld59cRZIn53Uf0NhkWdcGIdNzOSRCZrkyj81xemBTQrOmi", + "YWNjb3VundF86E54f6seADTvrVjgeY3mrFNYsTn4jKVH5G5UyixyKkJi7T1S", + "YWNjb3VundF8MCmSFzV7LO4VRrxpJME8YrZCb6MyLp5KhRz4Q3crCjsDxPvI", + "YWNjb3VundF8tKh2Lye5ehjWsrSQUBTq6L4caohAKvG71qJVSOkMKDCKcKGu", + "YWNjb3VundF8xZYwIg4AFeVlTmrjBovgjxCSsHxYenyTTNbnNo1a0gIgs75V", + "YWNjb3VundF8QcNhks2O2ObIVmVXoIr1fuPPGTQ34YsaE0idvLVqTM5bSjbr", + "YWNjb3VundF8JtqahIBkypktae5H98q3PYjFXYPzqukmwY2wIOYqLSrYg0JQ", + "YWNjb3VundF8x4GsJSnSBns6y5tVGZRlDdC0w40k1ApVlj8v9cme64KNHmKq", + "YWNjb3VundF8GbE7ycPaH0fSozZ80v38jC00qdJB5YJRJJeqdy4DomjKG2ns", + "YWNjb3VundF83KP9txx57PNlElIa61g7vi7QQ1BTw4nlyPn6Tw8P4bXfX5IT", + "YWNjb3VundF8CDELpJV0axNw1AH4Pb7N1yfoe9HzyL0u9XQEnW3tgXVj1rbB", + "YWNjb3VundF8AzmnXydKyjDthsIx7BaYn6xof2lRh4pdJRTJT8qmupaLi7pX", + "YWNjb3VundF8PwLbajYpTYLe2dVhm1EX8seXxsPJlbpkxT8LhSONHhffW48Z", + "YWNjb3VundF8OGELq8i2wxXDw2kniuY9wp9nRz6xvoDU5jfFo2vsiUeoO2MV", + "YWNjb3VundF8u5aQbeM0LrTQcxc3t4DcbvZp1kBoDueP0q0rMjDPvLefG3WR", +] + +camps = json.load(open("campaigns.json")) +mg = {c["campid"]: c for c in camps if c.get("channel") == "MediaGo"} +mg_ids = list(mg.keys()) +if not mg: + print("[update] MediaGo 无目标 campid,跳过"); raise SystemExit(0) +PKGS = ",".join(sorted({c["pkg"] for c in mg.values()})) +target = (date.today() - timedelta(days=1)).isoformat() + +def get_token(api_token): + req = urllib.request.Request(AUTH_URL, data=json.dumps({"api_token": api_token}).encode(), + headers={"Content-Type": "application/json"}, method="POST") + with urllib.request.urlopen(req, timeout=40) as r: + return json.loads(r.read().decode())["data"]["AccessToken"] + +def cost_daily(tok): + p = [("dimension","campaign"),("tz","UTC+8"),("app_ids",PKGS), + ("start_date",target),("end_date",target),("page_idx",0),("page_size",100)] + req = urllib.request.Request(COST_URL + "?" + urllib.parse.urlencode(p), + headers={"Authorization":"Bearer "+tok}, method="GET") + with urllib.request.urlopen(req, timeout=60) as r: + d = json.loads(r.read().decode()) + return d.get("data",{}).get("list") or [] if d.get("code")==0 else [] + +new_rows = [] +for api_token in TOKENS: + try: + tok = get_token(api_token) + lst = cost_daily(tok) + except Exception: + continue + for r in lst: + cn = r.get("campaign_name","") + cid = next((c for c in mg_ids if cn.startswith(c) or c in cn), None) + if not cid: continue + imp=int(r.get("imp") or 0); clk=int(r.get("click") or 0); cv=int(r.get("cv") or 0); sp=float(r.get("spend") or 0) + if imp==0 and clk==0 and sp==0: continue + rec = mg[cid] + new_rows.append({ + "date": r.get("date"), "channel":"MediaGo", "campid":cid, + "offer_name":cn, "product":rec["product"], "pkg":rec["pkg"], + "location":(r.get("geo") or "").upper(), "bid_type":"", + "impression":imp, "clicks":clk, "conversions":cv, + "ctr":round(clk/imp,5) if imp else 0.0, "cvr":round(cv/clk,5) if clk else 0.0, + "spend":round(sp,2), + }) + time.sleep(0.3) +print(f"[update] MediaGo 新增匹配 {len(new_rows)} 条 ({target})") + +existing = json.load(open("mtg_data.json")) if os.path.exists("mtg_data.json") else [] +merged = {(r["date"],r["campid"],r["location"],r.get("channel","")): r for r in existing} +for r in new_rows: + merged[(r["date"],r["campid"],r["location"],r["channel"])] = r +out = sorted(merged.values(), key=lambda x:(x["date"], x.get("channel",""), -x["impression"])) +json.dump(out, open("mtg_data.json","w"), ensure_ascii=False, indent=2) +print(f"[update] MediaGo 合并后共 {len(out)} 条,已写入 mtg_data.json") +PYEOF + echo "[update] $(date '+%Y-%m-%d %H:%M:%S') 完成"