作为一个编程外行来说,在他人的代码上进行小幅度的修改或许还可以,一旦需要实现新的功能那简直就是一场灾难。
最早我在心百科中收录书籍的目的有两个,一个是为了方便引用和记录笔记,一个就是为了实现个人藏书的记录。自打晒书房APP下架之后就再没有找到合适的工具,即便有也用起来不那么放心了,天知道哪天又关了呢?幸幸苦苦地扫了那么多书,结果说不能用就不能用。
用自己的网站哪怕有一天被迫关了,数据仍然可以迁移到自己本地的服务器上,所以我一直希望能够实现该功能。而思路就是利用小工具Gadget,这样的话用不用这功能可以根据自己需要来决定。
从维基百科中搜索到的小工具中有一个收藏的,但它针对的主要是图片。主要思路是看到某张图片觉得还不错,那么点击收藏链接后就会添加到该用户的某个子目录下,并以Gallery的方式显示。从原理上来说,貌似跟我要实现的效果差不多,无非它是图片我是图书,它是file命名空间,我是图书命名空间,我也巴不得显示图书封面。
源代码我就不贴了,就放个链接吧。
结果还是想简单了。光获取图书页面中的图片就费了我好大周章,最后还是在ChatGPT的辅助下完成了封面的显示。
在MediaWiki中,如果要获得某个条目中的图片,最简单的方式就是通过API,而官方并没有输出头图的API可用。
现成方案中,导航Popup小工具中能够抓取条目中的头图,但是要从其中分离出部分代码来,就我目前的水平来说有点难。还有一种就是通过PageImages扩展提供的API,它能够很好地支持头图的调用。官方示例如下:

api.php?action=query&prop=pageimages&titles=Lightbox_demo

返回结果:

{
    "query": {
        "normalized": [
            {
                "from": "Lightbox_demo",
                "to": "Lightbox demo"
            }
        ],
        "pages": {
            "162510": {
                "pageid": 162510,
                "ns": 0,
                "title": "Lightbox demo",
                "thumbnail": {
                    "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Crystal_Clear_app_korganizer.png/50px-Crystal_Clear_app_korganizer.png",
                    "width": 50,
                    "height": 50
                },
                "pageimage": "Crystal_Clear_app_korganizer.png"
            }
        }
    }
}

pageimage中的就是我们想要的结果。
按照API的js写法,放到网页调试的控制台中试一下:

var image = {
    action: 'query',
    prop: 'pageimages',
    formatversion: 2 ,
    titles: mw.config.get('wgPageName'),
    format: 'json'
    },
    api = new mw.Api();
    
api.get( image ).done( function ( data ) {
    var pages = data.query.pages;
    console.log(pages[0].pageimage);
} );

PageImages_API_result.png
OK,图片信息被返回了。那怎么加入到原有的代码中呢?尤其是把数据赋给全局变量。ChatGPT告诉我,“API请求是异步的,可能需要适当处理异步操作”,完全没概念啊。虽然它也给了几个解决办法,但怎么应用到我具体的案例中呢?干脆扔给它处理算了。
结果倒还真在藏书页面中能够显示图书封面了,只不过链接和显示文字都是图片名。
MediaWiki藏书.png
到这里,我已经不知道怎么引导ChatGPT,或者说它可能也无能为力了。不过它还算是帮了我一个大忙。
哪位好心人要是正好看到,同时也懂编程的,不妨给些指导,多谢!

最后修改:2024 年 01 月 21 日
如果觉得我的文章对你有用,请随意赞赏