You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Python中调用存在第三方依赖的JavaScript函数?

解决方案

js2py等纯Python实现的JS运行库仅支持标准ECMAScript语法,无法兼容Node环境API和puppeteer这类第三方npm依赖,你的现有JS代码无法通过这类库直接调用,推荐以下两个可行方案:


方案1:Python调用Node执行现有JS(推荐,无需重写已验证的JS逻辑)

步骤1:修改你的JS脚本(命名为shorturl.js),新增命令行参数接收逻辑

const puppeteer = require('puppeteer');

async function shorturl(link) {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto("https://www.shorturl.at", { waitUntil: 'networkidle0' });

    await page.waitForSelector('input[name=u]');
    await page.$eval('input[name=u]', (el, value) => el.value = value, link);
    await page.click('input[type="submit"]');
    await page.waitForSelector('#shortenurl');

    const result = await page.evaluate(() => {
        const anchor = document.querySelector('#shortenurl').value;
        return anchor;
    });

    await browser.close();
    return result;
};

// 新增:接收命令行传入的长链接参数
(async () => {
    const targetLink = process.argv[2]
    const shortLink = await shorturl(targetLink)
    // 输出结果供Python读取
    console.log(shortLink)
})()

步骤2:Python侧通过subprocess调用Node执行脚本

import subprocess

def get_short_url(long_link):
    # 请替换为你的shorturl.js实际文件路径
    js_path = "./shorturl.js"
    result = subprocess.run(
        ["node", js_path, long_link],
        capture_output=True,
        text=True,
        encoding="utf-8"
    )
    if result.returncode == 0:
        # 去除首尾空白字符拿到短链接
        return result.stdout.strip()
    else:
        raise Exception(f"执行失败:{result.stderr}")

# 调用示例
if __name__ == "__main__":
    print(get_short_url("https://www.example.com"))

该方案前提:本地已安装Node环境,且在JS脚本所在目录执行过npm install puppeteer安装依赖


方案2:转用Python版Puppeteer(Pyppeteer),纯Python栈无需Node

先安装依赖:pip install pyppeteer
对应实现代码:

import asyncio
from pyppeteer import launch

async def shorturl(link):
    browser = await launch(headless=True)
    page = await browser.newPage()
    await page.goto("https://www.shorturl.at", waitUntil="networkidle0")
    
    await page.waitForSelector('input[name=u]')
    await page.evaluate('(el, value) => el.value = value', await page.querySelector('input[name=u]'), link)
    await page.click('input[type="submit"]')
    await page.waitForSelector('#shortenurl')
    
    result = await page.evaluate('document.querySelector("#shortenurl").value')
    await browser.close()
    return result

# 调用示例
if __name__ == "__main__":
    short_link = asyncio.run(shorturl("https://www.example.com"))
    print(short_link)

方案选择建议

如果你的JS逻辑已经调试稳定,优先选方案1,不需要重写逻辑可降低出错概率;如果希望整个项目都是Python技术栈,选方案2即可,API和JS版puppeteer基本一致,改动量很小。

内容的提问来源于stack exchange,提问作者Sleeper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:09:00