如何在WebKit中清除Cookies?

1 投票
1 回答
2208 浏览
提问于 2025-04-16 04:06

我现在正在用Python的PyWebKitGtk库做一些工作(可以在这里查看:http://live.gnome.org/PyWebKitGtk)。我想在我自己的小浏览器里清除所有的 cookies。 我发现了一个有趣的方法叫做 webkit.HTTPResponse.clearCookies(),但是我不知道怎么才能得到这个 HTTPResponse 对象的实例 :/

我不想用 JavaScript 来完成这个任务。

1 个回答

0

如果你去看看现在在GitHub上的绑定情况,你会发现PyWebKitGTK还没有提供你想要的功能——看起来没有对应的HTTPResponse类型。很遗憾,现在我觉得你只能用Javascript或者代理来解决这个问题。

编辑:

...当然,除非你真的非常想要这个功能,并且愿意熬夜学习ctypes。这样的话,你就可以做一些很厉害的事情。要清除浏览器的所有cookies,可以试试这个。

import gtk, webkit, ctypes

libwebkit = ctypes.CDLL('libwebkit-1.0.so')
libgobject = ctypes.CDLL('libgobject-2.0.so')
libsoup = ctypes.CDLL('libsoup-2.4.so')

v = webkit.WebView()

#do whatever it is you do with WebView...
....

#get the cookiejar from the default session
#(assumes one session and one cookiesjar)
generic_cookiejar_type = libgobject.g_type_from_name('SoupCookieJar')
cookiejar = libsoup.soup_session_get_feature(session, generic_cookiejar_type)

#build a callback to delete cookies
DEL_COOKIE_FUNC = ctypes.CFUNCTYPE(None, ctypes.c_void_p)
def del_cookie(cookie):
    libsoup.soup_cookie_jar_delete_cookie(cookiejar, cookie)

#run the callback on all the cookies
cookie_list =  libsoup.soup_cookie_jar_all_cookies(cookiejar)
libsoup.g_slist_foreach(cookie_list, DEL_COOKIE_FUNC(del_cookie), None)

编辑:

我自己刚开始需要这个功能,虽然这个想法是对的,但还需要改进。相反,可以试试这个——函数类型和cookiejar的访问问题已经修复了。

#add a new cookie jar
cookiejar = libsoup.soup_cookie_jar_new()

#uncomment the below line for a persistent jar instead
#cookiejar = libsoup.soup_cookie_jar_text_new('/path/to/your/cookies.txt',False)

libsoup.soup_session_add_feature(session, cookiejar)

#build a callback to delete cookies
DEL_COOKIE_FUNC = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p, ctypes.c_void_p)
def del_cookie(cookie, userdata):
    libsoup.soup_cookie_jar_delete_cookie(cookiejar, cookie)
    return 0

#run the callback on all the cookies
cookie_list =  libsoup.soup_cookie_jar_all_cookies(cookiejar)
libsoup.g_slist_foreach(cookie_list, DEL_COOKIE_FUNC(del_cookie), None)

请注意,你应该只在使用WebView之前,或者在WebKit的回调中做这个操作,否则你会遇到比通常与GTK编程相关的更多线程问题。

撰写回答