用于抓取 Facebook 群组成员并将其导出到 CSV 文件的脚本。此 Facebook 群组成员提取器在浏览器中工作,无需安装扩展程序或使用代理。只需将脚本复制粘贴到 Chrome 控制台中即可。
前往 Facebook 群组页面
打开 Chrome 开发者控制台
复制 将以下代码粘贴到控制台中。它将添加一个“下载 0 个成员”按钮。重要提示:在移动到“人员/成员”选项卡之前复制/粘贴
单击群组页面的“人员”选项卡
滚动以加载将被脚本抓取的新成员。按钮计数器随着新成员的刮除而增加。
完成后,点击“下载 X 成员”按钮下载生成的 CSV 文件
配置文件将保存在缓存中,直到您单击“重置”按钮。由于此缓存,如果您的浏览器“崩溃”,提取的配置文件仍然可用
阅读我们的分步指南,提取 Facebook 群组成员并查找他们的 LinkedIn 个人资料
dist/main.min.js
var G=Object.defineProperty,Q=(e,t,n)=>t in e?G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}): e[t]=n,M=(e,t,n)=>(Q(e,"符号"!=typeof t?t+"":t,n),n);函数ee(e,t){for(var n="",r=0;r<t.length;r++)n+=函数(e){for(var t="",n=0;n<e. length;n++){var r=null===e[n]||"u"<typeof e[n]?"":e[n].toString(),r=(r=e[n]instanceof Date?e[n].toLocaleString():r).replace(/"/g,'""');0<n&&(t+=","),t+=r=0<=r.search(/ ("|,|n)/g)?'"'+r+'"':r}return t+``}(t[r]);var i=new Blob([n],{type:"text/csv;charset=utf-8;"}),o=document.createElement("a");void 0!==o.download&&(i=URL.createObjectURL(i),o.setAttribute("href",i),o.setAttribute("download",e),document.body.appendChild(o),o. click(),document.body.removeChild(o))}const _=(t,e)=>e.some(e=>t instanceof e);let P,j;function te(){return P=P||[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]}function ne(){return j=j||[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey]}const D =新的WeakMap,E=新的WeakMap,b=新的WeakMap;函数re(o){var e=new Promise((e,t)=>{const n=()=>{o.removeEventListener("成功",r),o.removeEventListener("错误",i)},r=()=>{e(h(o.结果)),n() },i=()=>{t(o.error),n()};o.addEventListener("成功",r),o.addEventListener("错误",i)});return b.set(e,o),e}函数 ie(o){var e;D.has(o)||(e=new Promise((e,t)=>{const n=()=>{o.removeEventListener("完成",r),o.removeEventListener("错误",i),o.removeEventListener("中止",i)},r=()=>{e( ),n()},i=()=>{t(o.error||新DOMException("AbortError","AbortError")),n()};o.addEventListener("完成",r),o.addEventListener("错误",i),o.addEventListener("abort",i)} ),D.set(o,e))}let C={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return D.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return h(e[t])}, set(e,t,n){返回e[t]=n,!0},has(e,t){返回e实例IDBTransaction&&("done"===t||"store"===t)||t in e}};函数 K(e){C=e(C)}函数 oe(t){return ne() .includes(t)?function(...e){return t.apply(S(this),e),h(this.request)}:function(...e){return h(t.apply(S(this),e))}}function se(e){return"function"==typeof e?oe(e):(e instanceof IDBTransaction&&ie(e),_(e,te( ))?new Proxy(e,C):e)}函数 h(e){if(e instanceof IDBRequest)return re(e);if(E.has(e))return E.get(e);var t=se(e);return t!==e&&(E.set(e,t),b.set(t,e)),t}const S=e=>b.get(e);函数 ae (e,t,{阻塞:n,升级:r,阻塞:i,终止:o}={}){const s=indexedDB.open(e,t),a=h(s);返回r&&s.addEventListener("需要升级",e=>{r(h(s.result),e.oldVersion,e.newVersion,h(s.transaction),e)}),n&&s.addEventListener("被阻止",e =>n(e.oldVersion,e.ne wVersion,e)),a.then(e=>{o&&e.addEventListener("关闭",()=>o()),i&&e.addEventListener("versionchange",e=>i(e.oldVersion,e. newVersion,e))}).catch(()=>{}),a}const ce=["get","getKey","getAll","getAllKeys","count"],de=["放置","添加","删除","清除"],I=新地图;功能R(e,t){if(e instanceof IDBDatabase&&!(t in e)&&"string"==typeof t){if(I.get(t))return I.get(t);const r=t.replace(/FromIndex$/,""),i=t!==r,o=de.includes(r);return r in(i?IDBIndex:IDBObjectStore).prototype&&(o||ce.包括(r))?(e=异步函数(e,...t){e=this.transaction(e,o?"readwrite":"readonly");let n=e.store;return i&&(n=n.index(t.shift())),(await Promise.all([n[r](...t),o&&e.done]))[0]},I.set(t ,e),e):无效0}}K(r=>({...r,get:(e,t,n)=>R(e,t)||r.get(e,t,n),有:(e, t)=>!!R(e,t)||r.has(e,t)}));const le=["继续","继续PrimaryKey","前进"],V={},B=新的 WeakMap,U=新WeakMap,ue={get(e,t){if(!le.includes(t))return e[t];let n=V[t];return n=n||(V[t]=function( ...e){B.set(this,U.get(this)[t](...e))})}};异步函数*fe(...e){let t=this;if (t=t IDBCursor 实例?t:等待t.openCursor(...e)){t=t;var n=new Proxy(t,ue);for(U