340 lines
11 KiB
Python
340 lines
11 KiB
Python
"""App name to iOS bundle ID mapping for supported applications.
|
|
|
|
Based on iOS app bundle ID conventions and common iOS applications.
|
|
Bundle IDs are in the format: com.company.appName
|
|
"""
|
|
|
|
APP_PACKAGES_IOS: dict[str, str] = {
|
|
# Tencent Apps (腾讯系)
|
|
"微信": "com.tencent.xin",
|
|
"企业微信": "com.tencent.ww",
|
|
"微信读书": "com.tencent.weread",
|
|
"微信听书": "com.tencent.wehear",
|
|
"QQ": "com.tencent.mqq",
|
|
"QQ音乐": "com.tencent.QQMusic",
|
|
"QQ阅读": "com.tencent.qqreaderiphone",
|
|
"QQ邮箱": "com.tencent.qqmail",
|
|
"QQ浏览器": "com.tencent.mttlite",
|
|
"TIM": "com.tencent.tim",
|
|
"微视": "com.tencent.microvision",
|
|
"腾讯新闻": "com.tencent.info",
|
|
"腾讯视频": "com.tencent.live4iphone",
|
|
"腾讯动漫": "com.tencent.ied.app.comic",
|
|
"腾讯微云": "com.tencent.weiyun",
|
|
"腾讯体育": "com.tencent.sportskbs",
|
|
"腾讯文档": "com.tencent.txdocs",
|
|
"腾讯翻译君": "com.tencent.qqtranslator",
|
|
"腾讯课堂": "com.tencent.edu",
|
|
"腾讯地图": "com.tencent.sosomap",
|
|
"小鹅拼拼": "com.tencent.dwdcoco",
|
|
"全民k歌": "com.tencent.QQKSong",
|
|
# Alibaba Apps (阿里系)
|
|
"支付宝": "com.alipay.iphoneclient",
|
|
"钉钉": "com.laiwang.DingTalk",
|
|
"闲鱼": "com.taobao.fleamarket",
|
|
"淘宝": "com.taobao.taobao4iphone",
|
|
"斗鱼": "tv.douyu.live",
|
|
"天猫": "com.taobao.tmall",
|
|
"口碑": "com.taobao.kbmeishi",
|
|
"饿了么": "me.ele.ios.eleme",
|
|
"高德地图": "com.autonavi.amap",
|
|
"UC浏览器": "com.ucweb.iphone.lowversion",
|
|
"一淘": "com.taobao.etaocoupon",
|
|
"飞猪": "com.taobao.travel",
|
|
"虾米音乐": "com.xiami.spark",
|
|
"淘票票": "com.taobao.movie.MoviePhoneClient",
|
|
"优酷": "com.youku.YouKu",
|
|
"菜鸟裹裹": "com.cainiao.cnwireless",
|
|
"土豆视频": "com.tudou.tudouiphone",
|
|
# ByteDance Apps (字节系)
|
|
"抖音": "com.ss.iphone.ugc.Aweme",
|
|
"抖音极速版": "com.ss.iphone.ugc.aweme.lite",
|
|
"抖音火山版": "com.ss.iphone.ugc.Live",
|
|
"Tiktok": "com.zhiliaoapp.musically",
|
|
"飞书": "com.bytedance.ee.lark",
|
|
"今日头条": "com.ss.iphone.article.News",
|
|
"西瓜视频": "com.ss.iphone.article.Video",
|
|
"皮皮虾": "com.bd.iphone.super",
|
|
# Meituan Apps (美团系)
|
|
"美团": "com.meituan.imeituan",
|
|
"美团外卖": "com.meituan.itakeaway",
|
|
"大众点评": "com.dianping.dpscope",
|
|
"美团优选": "com.meituan.iyouxuan",
|
|
"美团优选团长": "com.meituan.igrocery.gh",
|
|
"美团骑手": "com.meituan.banma.homebrew",
|
|
"美团开店宝": "com.meituan.imerchantbiz",
|
|
"美团拍店": "com.meituan.pai",
|
|
"美团众包": "com.meituan.banma.crowdsource",
|
|
"美团买菜": "com.baobaoaichi.imaicai",
|
|
# JD Apps (京东系)
|
|
"京东": "com.360buy.jdmobile",
|
|
"京东读书": "com.jd.reader",
|
|
# NetEase Apps (网易系)
|
|
"网易新闻": "com.netease.news",
|
|
"网易云音乐": "com.netease.cloudmusic",
|
|
"网易邮箱大师": "com.netease.macmail",
|
|
"网易严选": "com.netease.yanxuan",
|
|
"网易公开课": "com.netease.videoHD",
|
|
"网易有道词典": "youdaoPro",
|
|
"有道云笔记": "com.youdao.note.YoudaoNoteMac",
|
|
# Baidu Apps (百度系)
|
|
"百度": "com.baidu.BaiduMobile",
|
|
"百度网盘": "com.baidu.netdisk",
|
|
"百度贴吧": "com.baidu.tieba",
|
|
"百度地图": "com.baidu.map",
|
|
"百度阅读": "com.baidu.yuedu",
|
|
"百度翻译": "com.baidu.translate",
|
|
"百度文库": "com.baidu.Wenku",
|
|
"百度视频": "com.baidu.videoiphone",
|
|
"百度输入法": "com.baidu.inputMethod",
|
|
# Kuaishou Apps (快手系)
|
|
"快手": "com.jiangjia.gif",
|
|
"快手极速版": "com.kuaishou.nebula",
|
|
# Other Popular Apps
|
|
"哔哩哔哩": "tv.danmaku.bilianime",
|
|
"芒果TV": "com.hunantv.imgotv",
|
|
"苏宁易购": "SuningEMall",
|
|
"微博": "com.sina.weibo",
|
|
"微博极速版": "com.sina.weibolite",
|
|
"微博国际": "com.weibo.international",
|
|
"墨客": "com.moke.moke.iphone",
|
|
"豆瓣": "com.douban.frodo",
|
|
"知乎": "com.zhihu.ios",
|
|
"小红书": "com.xingin.discover",
|
|
"喜马拉雅": "com.gemd.iting",
|
|
"得到": "com.luojilab.LuoJiFM-IOS",
|
|
"得物": "com.siwuai.duapp",
|
|
"起点读书": "m.qidian.QDReaderAppStore",
|
|
"番茄小说": "com.dragon.read",
|
|
"书旗小说": "com.shuqicenter.reader",
|
|
"拼多多": "com.xunmeng.pinduoduo",
|
|
"多点": "com.dmall.dmall",
|
|
"便利蜂": "com.bianlifeng.customer.ios",
|
|
"亿通行": "com.ruubypay.yitongxing",
|
|
"云闪付": "com.unionpay.chsp",
|
|
"大都会Metro": "com.DDH.SHSubway",
|
|
"爱奇艺视频": "com.qiyi.iphone",
|
|
"搜狐视频": "com.sohu.iPhoneVideo",
|
|
"搜狐新闻": "com.sohu.newspaper",
|
|
"搜狗浏览器": "com.sogou.SogouExplorerMobile",
|
|
"虎牙": "com.yy.kiwi",
|
|
"比心": "com.yitan.bixin",
|
|
"转转": "com.wuba.zhuanzhuan",
|
|
"YY": "yyvoice",
|
|
"绿洲": "com.sina.oasis",
|
|
"陌陌": "com.wemomo.momoappdemo1",
|
|
"什么值得买": "com.smzdm.client.ios",
|
|
"美团秀秀": "com.meitu.mtxx",
|
|
"唯品会": "com.vipshop.iphone",
|
|
"唱吧": "com.changba.ktv",
|
|
"酷狗音乐": "com.kugou.kugou1002",
|
|
"CSDN": "net.csdn.CsdnPlus",
|
|
"多抓鱼": "com.duozhuyu.dejavu",
|
|
"自如": "com.ziroom.ZiroomProject",
|
|
"携程": "ctrip.com",
|
|
"去哪儿旅行": "com.qunar.iphoneclient8",
|
|
"Xmind": "net.xmind.brownieapp",
|
|
"印象笔记": "com.yinxiang.iPhone",
|
|
"欧陆词典": "eusoft.eudic.pro",
|
|
"115": "com.115.personal",
|
|
"名片全能王": "com.intsig.camcard.lite",
|
|
"中国银行": "com.boc.BOCMBCI",
|
|
"58同城": "com.taofang.iphone",
|
|
# International Apps
|
|
"Google Chrome": "com.google.chrome.ios",
|
|
"Gmail": "com.google.Gmail",
|
|
"Facebook": "com.facebook.Facebook",
|
|
"Firefox": "org.mozilla.ios.Firefox",
|
|
"Messenger": "com.facebook.Messenger",
|
|
"Instagram": "com.burbn.instagram",
|
|
"Starbucks": "com.starbucks.mystarbucks",
|
|
"Luckin Coffee": "com.bjlc.luckycoffee",
|
|
"Line": "jp.naver.line",
|
|
"Linkedin": "com.linkedin.LinkedIn",
|
|
"Dcard": "com.dcard.app.Dcard",
|
|
"Youtube": "com.google.ios.youtube",
|
|
"Spotify": "com.spotify.client",
|
|
"Netflix": "com.netflix.Netflix",
|
|
"Twitter": "com.atebits.Tweetie2",
|
|
"WhatsApp": "net.whatsapp.WhatsApp",
|
|
# Apple Native Apps (Apple 原生应用)
|
|
"Safari": "com.apple.mobilesafari",
|
|
"App Store": "com.apple.AppStore",
|
|
"设置": "com.apple.Preferences",
|
|
"相机": "com.apple.camera",
|
|
"照片": "com.apple.mobileslideshow",
|
|
"时钟": "com.apple.mobiletimer",
|
|
"闹钟": "com.apple.mobiletimer",
|
|
"备忘录": "com.apple.mobilenotes",
|
|
"提醒事项": "com.apple.reminders",
|
|
"快捷指令": "com.apple.shortcuts",
|
|
"天气": "com.apple.weather",
|
|
"日历": "com.apple.mobilecal",
|
|
"地图": "com.apple.Maps",
|
|
"电话": "com.apple.mobilephone",
|
|
"通讯录": "com.apple.MobileAddressBook",
|
|
"信息": "com.apple.MobileSMS",
|
|
"Facetime": "com.apple.facetime",
|
|
"FaceTime": "com.apple.facetime",
|
|
"计算器": "com.apple.calculator",
|
|
"家庭": "com.apple.Home",
|
|
"健康": "com.apple.Health",
|
|
"钱包": "com.apple.Passbook",
|
|
"股市": "com.apple.stocks",
|
|
"图书": "com.apple.iBooks",
|
|
"新闻": "com.apple.news",
|
|
"视频": "com.apple.tv",
|
|
"文件": "com.apple.DocumentsApp",
|
|
"邮件": "com.apple.mobilemail",
|
|
"查找": "com.apple.findmy",
|
|
"翻译": "com.apple.Translate",
|
|
"音乐": "com.apple.Music",
|
|
"播客": "com.apple.podcasts",
|
|
"库乐队": "com.apple.mobilegarageband",
|
|
"语音备忘录": "com.apple.VoiceMemos",
|
|
"iMovie": "com.apple.iMovie",
|
|
"Watch": "com.apple.Bridge",
|
|
"Apple Store": "com.apple.store.Jolly",
|
|
"TestFlight": "com.apple.TestFlight",
|
|
"Keynote": "com.apple.Keynote",
|
|
"Keynote 讲演": "com.apple.Keynote",
|
|
}
|
|
|
|
|
|
def get_bundle_id(app_name: str) -> str | None:
|
|
"""
|
|
Get the iOS bundle ID for an app.
|
|
|
|
Args:
|
|
app_name: The display name of the app.
|
|
|
|
Returns:
|
|
The iOS bundle ID, or None if not found.
|
|
"""
|
|
return APP_PACKAGES_IOS.get(app_name)
|
|
|
|
|
|
def get_app_name(bundle_id: str) -> str | None:
|
|
"""
|
|
Get the app name from an iOS bundle ID.
|
|
|
|
Args:
|
|
bundle_id: The iOS bundle ID.
|
|
|
|
Returns:
|
|
The display name of the app, or None if not found.
|
|
"""
|
|
for name, bid in APP_PACKAGES_IOS.items():
|
|
if bid == bundle_id:
|
|
return name
|
|
return None
|
|
|
|
|
|
def list_supported_apps() -> list[str]:
|
|
"""
|
|
Get a list of all supported iOS app names.
|
|
|
|
Returns:
|
|
List of app names.
|
|
"""
|
|
return list(APP_PACKAGES_IOS.keys())
|
|
|
|
|
|
def check_app_installed(app_name: str, wda_url: str = "http://localhost:8100") -> bool:
|
|
"""
|
|
Check if an app is installed on the iOS device.
|
|
|
|
Args:
|
|
app_name: The display name of the app.
|
|
wda_url: WebDriverAgent URL.
|
|
|
|
Returns:
|
|
True if app is installed, False otherwise.
|
|
|
|
Note:
|
|
This uses the iTunes API to get app information. For actual
|
|
installation check on device, you would need to use WDA's
|
|
app listing capabilities or URL scheme checking.
|
|
"""
|
|
bundle_id = get_bundle_id(app_name)
|
|
if not bundle_id:
|
|
return False
|
|
|
|
try:
|
|
import requests
|
|
|
|
# Query iTunes API for app info
|
|
url = f"https://itunes.apple.com/lookup?bundleId={bundle_id}"
|
|
response = requests.get(url, timeout=10)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
return data.get("resultCount", 0) > 0
|
|
|
|
except ImportError:
|
|
print("Error: requests library required. Install: pip install requests")
|
|
except Exception as e:
|
|
print(f"Error checking app installation: {e}")
|
|
|
|
return False
|
|
|
|
|
|
def get_app_info_from_itunes(bundle_id: str) -> dict | None:
|
|
"""
|
|
Get app information from iTunes API using bundle ID.
|
|
|
|
Args:
|
|
bundle_id: The iOS bundle ID.
|
|
|
|
Returns:
|
|
Dictionary with app info (name, version, etc.) or None if not found.
|
|
"""
|
|
try:
|
|
import requests
|
|
|
|
url = f"https://itunes.apple.com/lookup?bundleId={bundle_id}"
|
|
response = requests.get(url, timeout=10)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
results = data.get("results", [])
|
|
if results:
|
|
return results[0]
|
|
|
|
except ImportError:
|
|
print("Error: requests library required. Install: pip install requests")
|
|
except Exception as e:
|
|
print(f"Error fetching app info: {e}")
|
|
|
|
return None
|
|
|
|
|
|
def get_app_info_by_id(app_store_id: str) -> dict | None:
|
|
"""
|
|
Get app information from iTunes API using App Store ID.
|
|
|
|
Args:
|
|
app_store_id: The numeric App Store ID (e.g., "414478124" for WeChat).
|
|
|
|
Returns:
|
|
Dictionary with app info or None if not found.
|
|
"""
|
|
try:
|
|
import requests
|
|
|
|
url = f"https://itunes.apple.com/lookup?id={app_store_id}"
|
|
response = requests.get(url, timeout=10)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
results = data.get("results", [])
|
|
if results:
|
|
return results[0]
|
|
|
|
except ImportError:
|
|
print("Error: requests library required. Install: pip install requests")
|
|
except Exception as e:
|
|
print(f"Error fetching app info by ID: {e}")
|
|
|
|
return None
|