<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel rdf:about="https://let.hatelabo.jp/furyu-tei/rss">
    <link>https://let.hatelabo.jp/furyu-tei/rss</link>
    <description></description>
    <title>Bookmarklets from furyu-tei</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/itqCwruYgMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/j5Cz9sXMgKAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/kbKijM-sgqAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/kOPl-_-QgsAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/kLvm7Oz0gOAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/hJmdpf3zhZcA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/j9W0mKmGgKAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/ivDEh__8gKAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/jYvYlf7QgYAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/jP6Y1ITYgcAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/i92Q_LjAgMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/iu6czrPagKAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/hJmf7tzjlu5j"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/ir-Nt4nwgaAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/irvx8sf4gaAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/g5G0rbat-JM4"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/g5G0rNui1MJh"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/g5G0qsXXn_V4"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/g5G0q-6rlLJs"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/g5G0lpjGgPg9"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/itqCwruYgMAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/itqCwruYgMAA</link>
    <dc:date>2026-01-29T11:10:49Z</dc:date>
    <description>Twitterユーザーのscreen_nameからユーザーIDを取得する</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] TwitterユーザーID取得</title>
    <content:encoded>&lt;a href="javascript:%28async%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20error_alert%3Derror_message%3D%3E%7Bconsole.error%28error_message%29%3Balert%28error_message%29%7D%3Blet%20screen_name%3Dwindow.getSelection%28%29.toString%28%29%7C%7Cprompt%28%27Input%20screen-name%20of%20user%27%2C%27%27%29%3Bif%28screen_name%3D%3D%3Dnull%29return%3Bscreen_name%3Dscreen_name.trim%28%29.replace%28%2F%5E%40%2F%2C%27%27%29%3Bif%28%21screen_name%29%7Berror_alert%28%27screen-name%20is%20empty%27%29%3Breturn%7Dconst%20api_info%3Dawait%28async%28%29%3D%3E%7Btry%7Bconst%20main_js_url%3Ddocument.querySelector%28%27link%5Bas%3D%22script%22%5D%5Bhref%2A%3D%22main%22%5D%27%29%3F.href%3F%3Fdocument.querySelector%28%27script%5Bsrc%2A%3D%22main%22%5D%5Bsrc%24%3D%22.js%22%5D%27%29%3F.src%3Bif%28%21main_js_url%29%7Bthrow%20new%20Error%28%60URL%20of%20main%2A.js%20is%20not%20found%60%29%7Dconst%20response%3Dawait%20fetch%28main_js_url%29%3Bif%28%21response.ok%29%7Bthrow%20new%20Error%28%60HTTP%20response%20status%20code%3D%24%7Bresponse.status%7D%60%29%7Dconst%20main_js_text%3Dawait%20response.text%28%29%3Bconst%20api_info_json%3Dmain_js_text.match%28%2F%5C%7Be%5C.exports%3D%28%5C%7B%5B%5E%7D%5D%2A%3FoperationName%3A%22UserByScreenName%22%5B%5Cs%5CS%5D%2A%3F%5C%7D%29%5C%7D%2C%5Cd%2B%3Ae%3D%3E%5C%7Be.exports%2F%29%5B1%5D.replace%28%2F%28%5Cw%2B%29%28%3F%3D%3A%29%2Fg%2C%27%22%241%22%27%29%3Bconst%20api_info%3DJSON.parse%28api_info_json%29%3Breturn%20api_info%7Dcatch%28error%29%7Berror_alert%28%60Fetch%20API-Information%20failure%3A%20%24%7Berror%7D%60%29%3Breturn%20null%7D%7D%29%28%29%3Bif%28%21api_info%29return%3Bconst%20user_id%3Dawait%28async%28%29%3D%3E%7Bconst%20base_url%3D%60https%3A%2F%2Fx.com%2Fi%2Fapi%2Fgraphql%2F%24%7Bapi_info.queryId%7D%2FUserByScreenName%60%3Bconst%20api2_auth_bearer%3D%27AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%253D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA%27%3Bconst%20csrf_token%3Ddocument.cookie.match%28%2Fct0%3D%28.%2A%3F%29%28%3F%3A%3B%7C%24%29%2F%29%5B1%5D%3Bconst%20search_params%3D%7Bvariables%3A%7Bscreen_name%3Ascreen_name%2CwithGrokTranslatedBio%3Afalse%7D%2Cfeatures%3A%7Bhidden_profile_subscriptions_enabled%3Atrue%2Cprofile_label_improvements_pcf_label_in_post_enabled%3Atrue%2Cresponsive_web_profile_redirect_enabled%3Afalse%2Crweb_tipjar_consumption_enabled%3Afalse%2Cverified_phone_label_enabled%3Afalse%2Csubscriptions_verification_info_is_identity_verified_enabled%3Atrue%2Csubscriptions_verification_info_verified_since_enabled%3Atrue%2Chighlights_tweets_tab_ui_enabled%3Atrue%2Cresponsive_web_twitter_article_notes_tab_enabled%3Atrue%2Csubscriptions_feature_can_gift_premium%3Atrue%2Ccreator_subscriptions_tweet_preview_api_enabled%3Atrue%2Cresponsive_web_graphql_skip_user_profile_image_extensions_enabled%3Afalse%2Cresponsive_web_graphql_timeline_navigation_enabled%3Atrue%7D%2CfieldToggles%3A%7BwithPayments%3Afalse%2CwithAuxiliaryUserLabels%3Atrue%7D%7D%3Bconst%20url_object%3Dnew%20URL%28base_url%29%3BObject.entries%28search_params%29.forEach%28%28%28%5Bkey%2Cvalue%5D%29%3D%3E%7Burl_object.searchParams.append%28key%2CJSON.stringify%28value%29%29%7D%29%29%3Btry%7Bconst%20response%3Dawait%20fetch%28url_object.href%2C%7Bmethod%3A%27GET%27%2Cheaders%3A%7Bauthorization%3A%60Bearer%20%24%7Bapi2_auth_bearer%7D%60%2C%27x-csrf-token%27%3Acsrf_token%2C%27x-twitter-active-user%27%3A%27yes%27%2C%27x-twitter-auth-type%27%3A%27OAuth2Session%27%2C%27x-twitter-client-language%27%3A%27en%27%7D%2Cmode%3A%27cors%27%2Ccredentials%3A%27include%27%7D%29%3Bif%28%21response.ok%29%7Bthrow%20new%20Error%28%60HTTP%20response%20status%20code%3D%24%7Bresponse.status%7D%60%29%7Dconst%20user_info%3Dawait%20response.json%28%29%3Bconst%20user_id%3Duser_info%3F.data%3F.user%3F.result%3F.rest_id%3Bif%28%21user_id%29%7Bthrow%20new%20Error%28%27Response%20does%20not%20include%20the%20ID%20of%20the%20user%27%29%7Dreturn%20user_id%7Dcatch%28error%29%7Berror_alert%28%60%22%24%7Bscreen_name%7D%22%20is%20not%20found%3A%20%24%7Berror%7D%60%29%3Breturn%20null%7D%7D%29%28%29%3Bif%28%21user_id%29return%3Btry%7Bawait%20navigator.clipboard.writeText%28user_id%29%7Dcatch%28error%29%7Bconsole.error%28%60Copy%20result%20to%20clipboard%20failure%3A%20%24%7Berror%7D%60%29%7Dfinally%7Blet%20prompt_required%3Dtrue%3Btry%7Bconst%20target%3Dwindow.getSelection%28%29.anchorNode.children%5B0%5D%3Bif%28target.tagName%3D%3D%27INPUT%27%29%7Bconst%20event%3Dnew%20Event%28%27input%27%2C%7Bbubbles%3Atrue%7D%29%3Bconst%20tracker%3Dtarget._valueTracker%3Bconst%20last_value%3Dtarget.value%3Bconst%20new_value%3Dlast_value.substring%280%2Ctarget.selectionStart%29%2Buser_id%2Blast_value.substring%28target.selectionEnd%29%3Btarget.value%3Dnew_value%3Bevent.simulated%3Dtrue%3Bif%28tracker%29tracker.setValue%28last_value%29%3Btarget.dispatchEvent%28event%29%3Bprompt_required%3Dfalse%7D%7Dcatch%28error%29%7Bconsole.error%28%60Failed%20to%20rewrite%20screen%20name%20to%20user%20ID%3A%20%24%7Berror%7D%60%29%7Dif%28prompt_required%29%7Bprompt%28%60User%20ID%20of%20%24%7Bscreen_name%7D%60%2Cuser_id%29%7D%7D%7D%29%28%29%3B"&gt;TwitterユーザーID取得&lt;/a&gt;&lt;pre&gt;/*
 * @title TwitterユーザーID取得
 * @description Twitterユーザーのscreen_nameからユーザーIDを取得する
 * @include https://twitter.com/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

(async () =&amp;gt; {
'use strict';

const error_alert = (error_message) =&amp;gt; {
    console.error(error_message);
    alert(error_message);
};

let screen_name = window.getSelection().toString() || prompt('Input screen-name of user', '');
if (screen_name === null) return;
screen_name = screen_name.trim().replace(/^@/, '');
if (! screen_name) {
    error_alert('screen-name is empty');
    return;
}

const api_info = await (async () =&amp;gt; {
    try {
        const main_js_url = document.querySelector('link[as=&amp;quot;script&amp;quot;][href*=&amp;quot;main&amp;quot;]')?.href ?? document.querySelector('script[src*=&amp;quot;main&amp;quot;][src$=&amp;quot;.js&amp;quot;]')?.src;
        if (! main_js_url) {
            throw new Error(`URL of main*.js is not found`);
        }
        const response = await fetch(main_js_url);
        if (! response.ok) {
            throw new Error(`HTTP response status code=${response.status}`);
        }
        const main_js_text = await response.text();
        const api_info_json = main_js_text.match(/\{e\.exports=(\{[^}]*?operationName:&amp;quot;UserByScreenName&amp;quot;[\s\S]*?\})\},\d+:e=&amp;gt;\{e.exports/)[1].replace(/(\w+)(?=:)/g, '&amp;quot;$1&amp;quot;');
        const api_info = JSON.parse(api_info_json);
        return api_info;
    }
    catch (error) {
        error_alert(`Fetch API-Information failure: ${error}`);
        return null;
    }
})();
if (! api_info) return;

const user_id = await (async () =&amp;gt; {
    const base_url = `https://x.com/i/api/graphql/${api_info.queryId}/UserByScreenName`;
    const api2_auth_bearer = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA';
    const csrf_token = document.cookie.match(/ct0=(.*?)(?:;|$)/)[1];
    const search_params = {
        variables: {
            &amp;quot;screen_name&amp;quot;: screen_name,
            &amp;quot;withGrokTranslatedBio&amp;quot;: false
        },
        features: {
            &amp;quot;hidden_profile_subscriptions_enabled&amp;quot;: true,
            &amp;quot;profile_label_improvements_pcf_label_in_post_enabled&amp;quot;: true,
            &amp;quot;responsive_web_profile_redirect_enabled&amp;quot;: false,
            &amp;quot;rweb_tipjar_consumption_enabled&amp;quot;: false,
            &amp;quot;verified_phone_label_enabled&amp;quot;: false,
            &amp;quot;subscriptions_verification_info_is_identity_verified_enabled&amp;quot;: true,
            &amp;quot;subscriptions_verification_info_verified_since_enabled&amp;quot;: true,
            &amp;quot;highlights_tweets_tab_ui_enabled&amp;quot;: true,
            &amp;quot;responsive_web_twitter_article_notes_tab_enabled&amp;quot;: true,
            &amp;quot;subscriptions_feature_can_gift_premium&amp;quot;: true,
            &amp;quot;creator_subscriptions_tweet_preview_api_enabled&amp;quot;: true,
            &amp;quot;responsive_web_graphql_skip_user_profile_image_extensions_enabled&amp;quot;: false,
            &amp;quot;responsive_web_graphql_timeline_navigation_enabled&amp;quot;: true
        },
        fieldToggles: {
            &amp;quot;withPayments&amp;quot;: false,
            &amp;quot;withAuxiliaryUserLabels&amp;quot;: true
        },
    };
    const url_object = new URL(base_url);
    Object.entries(search_params).forEach(([key, value]) =&amp;gt; {
        url_object.searchParams.append(key, JSON.stringify(value));
    });
    
    try {
        const response = await fetch(url_object.href, {
            method: 'GET',
            headers: {
                'authorization': `Bearer ${api2_auth_bearer}`,
                'x-csrf-token': csrf_token,
                'x-twitter-active-user': 'yes',
                'x-twitter-auth-type': 'OAuth2Session',
                'x-twitter-client-language': 'en',
            },
            mode: 'cors',
            credentials: 'include',
        });
        if (! response.ok) {
            throw new Error(`HTTP response status code=${response.status}`);
        }
        const user_info = await response.json();
        const user_id = user_info?.data?.user?.result?.rest_id;
        
        if (! user_id) {
            throw new Error('Response does not include the ID of the user');
        }
        return user_id;
    }
    catch (error) {
        error_alert(`&amp;quot;${screen_name}&amp;quot; is not found: ${error}`);
        return null;
    }
    
})();
if (! user_id) return;

try {
    await navigator.clipboard.writeText(user_id);
}
catch (error) {
    console.error(`Copy result to clipboard failure: ${error}`);
}
finally {
    let prompt_required = true;
    try {
        const target = window.getSelection().anchorNode.children[0];
        if (target.tagName == 'INPUT') {
            const event = new Event('input', {bubbles: true});
            const tracker = target._valueTracker;
            const last_value = target.value;
            const new_value = last_value.substring(0, target.selectionStart) + user_id + last_value.substring(target.selectionEnd);
            
            target.value = new_value;
            event.simulated = true;
            if (tracker) tracker.setValue(last_value);
            target.dispatchEvent(event);
            prompt_required = false;
        }
    }
    catch (error) {
        console.error(`Failed to rewrite screen name to user ID: ${error}`);
    }
    if ( prompt_required ) {
        prompt(`User ID of ${screen_name}`, user_id);
    }
}
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/j5Cz9sXMgKAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/j5Cz9sXMgKAA</link>
    <dc:date>2024-09-27T09:30:24Z</dc:date>
    <description>Twitterでシェアする際のツイート内容を自分用にカスタマイズ</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] Amazon #adツイート</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20show_text_link%3D%28%29%3D%3E%7Bdocument.querySelector%28%27%23amzn-ss-get-link-button%27%29.click%28%29%7D%2Cget_shortlink_url%3D%28%29%3D%3E%7Bconst%20shortlink_url%3Ddocument.querySelector%28%27%23amzn-ss-text-shortlink-textarea%27%29%3F.value%3Bif%28%21shortlink_url%29return%20null%3Breturn%20shortlink_url%7D%2Chide_text_link%3D%28%29%3D%3E%7Bdocument.querySelector%28%27button%5Bdata-action%3D%22a-popover-close%22%5D%27%29.click%28%29%7D%2Cobserve_main%3Drecords%3D%3E%7Bobserver.disconnect%28%29%3Bconst%20shortlink_url%3Dget_shortlink_url%28%29%3Bif%28%21shortlink_url%29%7Bobserver.observe%28document.body%2C%7BchildList%3Atrue%2Csubtree%3Atrue%7D%29%3Breturn%7Dfinish%28shortlink_url%29%7D%2Cfinish%3Dshortlink_url%3D%3E%7Bconst%20item_infos%3Ddocument.title.split%28%27%7C%27%29.map%28%28info%3D%3Einfo.trim%28%29%29%29%2Cintent_tweet_url_obj%3Dnew%20URL%28%27https%3A%2F%2Ftwitter.com%2Fintent%2Ftweet%27%29%2Curl_params%3Dintent_tweet_url_obj.searchParams%3Burl_params.set%28%27related%27%2C%27amazondeals%2Camazonmp3%27%29%3Bif%28item_infos.length%3D%3D5%26%26%28item_infos%5B2%5D%3D%3D%27%E6%9C%AC%27%7C%7C%2FKindle%2F.test%28item_infos%5B3%5D%29%29%29%7Burl_params.set%28%27text%27%2C%60%24%7Bitem_infos%5B0%5D%7D%5Cn%24%7Bitem_infos%5B1%5D%7D%20%23ad%60%29%7Delse%7Burl_params.set%28%27text%27%2C%60%24%7Bitem_infos%5Bitem_infos.length%3C2%7C%7Citem_infos%5B0%5D%21%3D%27Amazon%27%3F0%3A1%5D%7D%20%23ad%60%29%7Durl_params.set%28%27url%27%2Cshortlink_url%29%3Bwindow.open%28intent_tweet_url_obj.href%29%3Bhide_text_link%28%29%7D%2Cobserver%3Dnew%20MutationObserver%28observe_main%29%3Bshow_text_link%28%29%3Bobserve_main%28%29%7D%29%28%29%3B"&gt;Amazon #adツイート&lt;/a&gt;&lt;pre&gt;/*
 * @title Amazon #adツイート
 * @description Twitterでシェアする際のツイート内容を自分用にカスタマイズ
 * @include https://www.amazon.co.jp/*
 * @license MIT License
 * @javascript_url
 */
(() =&amp;gt; {
const
    show_text_link = () =&amp;gt; {
        //document.querySelector('#amzn-ss-text-link a').click();
        document.querySelector('#amzn-ss-get-link-button').click(); // 新アソシエイトツールバー対応(2024/09/27)
    },
    get_shortlink_url = () =&amp;gt; {
        const
            shortlink_url = document.querySelector('#amzn-ss-text-shortlink-textarea')?.value;
        if (! shortlink_url) return null;
        return shortlink_url;
    },
    hide_text_link = () =&amp;gt; {
        document.querySelector('button[data-action=&amp;quot;a-popover-close&amp;quot;]').click();
    },
    observe_main = ( records ) =&amp;gt; {
        observer.disconnect();
        const
            shortlink_url = get_shortlink_url();
        if (! shortlink_url) {
            observer.observe(document.body, {childList : true, subtree : true});
            return;
        }
        finish(shortlink_url);
    },
    finish = (shortlink_url) =&amp;gt; {
        const
            item_infos = document.title.split('|').map(info =&amp;gt; info.trim()),
            intent_tweet_url_obj = new URL('https://twitter.com/intent/tweet'),
            url_params = intent_tweet_url_obj.searchParams;
            
        url_params.set('related', 'amazondeals,amazonmp3');
        if ((item_infos.length == 5) &amp;amp;&amp;amp; ((item_infos[2] == '本') || (/Kindle/.test(item_infos[3])))) {
            url_params.set('text', `${item_infos[0]}\n${item_infos[1]} #ad`);
        }
        else {
            url_params.set('text', `${item_infos[((item_infos.length &amp;lt; 2) || (item_infos[0] != 'Amazon')) ? 0 : 1]} #ad`);
        }
        url_params.set('url', shortlink_url);
        window.open(intent_tweet_url_obj.href);
        hide_text_link();
    },
    observer = new MutationObserver( observe_main );
show_text_link();
observe_main();
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/kbKijM-sgqAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/kbKijM-sgqAA</link>
    <dc:date>2024-06-20T09:13:37Z</dc:date>
    <description>Amazon MusicのプレイリストをTune My Music互換のCSV形式でダウンロード</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] プレイリスト取得(Tune My Music互換)</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20headers%3D%5B%7Bkey%3A%27music_title%27%2Cname%3A%27Track%20name%27%7D%2C%7Bkey%3A%27artists%27%2Cname%3A%27Artist%20name%27%7D%2C%7Bkey%3A%27album_title%27%2Cname%3A%27Album%27%7D%2C%7Bkey%3A%27playlist_name%27%2Cname%3A%27Playlist%20name%27%7D%2C%7Bkey%3A%27list_type%27%2Cname%3A%27Type%27%7D%2C%7Bkey%3A%27isrc%27%2Cname%3A%27ISRC%27%7D%2C%7Bkey%3A%27asin%27%2Cname%3A%27Amazon%20-%20id%27%7D%5D%2Ccreate_csv_line%3Dvalues%3D%3Evalues.map%28%28value%3D%3E%60%22%24%7B%28%27%27%2Bvalue%29.replace%28%2F%22%2Fg%2C%27%22%22%27%29%7D%22%60%29%29.join%28%27%2C%27%29%2Cdownload_csv%3D%28csv_filename%2Ccsv_lines%29%3D%3E%7Bconst%20csv_text%3Dcsv_lines.join%28%27%5Cr%5Cn%27%29%2Cbom%3Dnew%20Uint8Array%28%5B239%2C187%2C191%5D%29%2Cblob%3Dnew%20Blob%28%5Bbom%2Ccsv_text%5D%2C%7Btype%3A%27text%2Fcsv%27%7D%29%2Cblob_url%3DURL.createObjectURL%28blob%29%2Cdownload_link%3Ddocument.createElement%28%27a%27%29%3Bdownload_link.href%3Dblob_url%3Bdownload_link.download%3Dcsv_filename%3Bdocument.documentElement.appendChild%28download_link%29%3Bdownload_link.click%28%29%3Bdownload_link.remove%28%29%7D%3Bconst%20header_csv_line%3Dcreate_csv_line%28headers.map%28%28head%3D%3Ehead.name%29%29%29%2Cplaylist_name%3Ddocument.querySelector%28%27music-detail-header.hydrated%5Blabel%5D%27%29.getAttribute%28%27headline%27%29%2Cmusic_info_list%3D%5B...document.querySelectorAll%28%27music-image-row.hydrated%5Bdata-key%5D%27%29%5D.map%28%28%28row%2Cindex%29%3D%3E%7Bconst%20music_title%3Drow.getAttribute%28%27primary-text%27%29%3F%3F%27%27%2Cmusic_url%3Drow.getAttribute%28%27primary-href%27%29%2Cartists%3Drow.getAttribute%28%27secondary-text-1%27%29%3F%3F%27%27%2Cartists_url%3Drow.getAttribute%28%27secondary-href-1%27%29%2Calbum_title%3Drow.getAttribute%28%27secondary-text-2%27%29%3F%3F%27%27%2Calbum_url%3Drow.getAttribute%28%27secondary-href-2%27%29%2Clist_type%3D%27Playlist%27%2Cisrc%3D%27%27%2Casin%3D%28music_url.match%28%2FtrackAsin%3D%28%5BA-Z0-9%5D%2B%29%2F%29%3F%3F%5B0%2C%27%27%5D%29%5B1%5D%3Breturn%7Bno%3Aindex%2B1%2Cmusic_title%3Amusic_title%2Cmusic_url%3Amusic_url%3Fnew%20URL%28music_url%2Clocation.href%29.href%3A%27%27%2Cartists%3Aartists%2Cartists_url%3Aartists_url%3Fnew%20URL%28artists_url%2Clocation.href%29.href%3A%27%27%2Calbum_title%3Aalbum_title%2Calbum_url%3Aalbum_url%3Fnew%20URL%28album_url%2Clocation.href%29.href%3A%27%27%2Clist_type%3Alist_type%2Cplaylist_name%3Aplaylist_name%2Cisrc%3Aisrc%2Casin%3Aasin%7D%7D%29%29%2Ccsv_lines%3D%5Bheader_csv_line%5D.concat%28music_info_list.map%28%28music_info%3D%3Ecreate_csv_line%28headers.map%28%28header%3D%3Emusic_info%5Bheader.key%5D%29%29%29%29%29%29%3Bdownload_csv%28%60%24%7Bplaylist_name%7D.csv%60%2Ccsv_lines%29%7D%29%28%29%3B"&gt;プレイリスト取得(Tune My Music互換)&lt;/a&gt;&lt;pre&gt;/*
 * @title プレイリスト取得(Tune My Music互換)
 * @description Amazon MusicのプレイリストをTune My Music互換のCSV形式でダウンロード
 * @include https://music.amazon.co.jp/playlists/*
 * @include https://music.amazon.co.jp/my/playlists/*
 * @license MIT License
 * @javascript_url
 */
(() =&amp;gt; {
const
    headers = [
        {key: 'music_title', name: 'Track name',},
        {key: 'artists', name: 'Artist name',},
        {key: 'album_title', name: 'Album',},
        {key: 'playlist_name', name: 'Playlist name',},
        {key: 'list_type', name: 'Type',},
        {key: 'isrc', name: 'ISRC',},
        {key: 'asin', name: 'Amazon - id',},
    ],
    create_csv_line = values =&amp;gt; values.map(value =&amp;gt; `&amp;quot;${('' + value).replace(/&amp;quot;/g, '&amp;quot;&amp;quot;')}&amp;quot;` ).join(','),
    download_csv = (csv_filename, csv_lines) =&amp;gt; {
        const
            csv_text = csv_lines.join('\r\n'),
            bom = new Uint8Array([0xEF, 0xBB, 0xBF]),
            blob = new Blob([bom, csv_text], {'type': 'text/csv'}),
            blob_url = URL.createObjectURL(blob),
            download_link = document.createElement('a');
        
        download_link.href = blob_url;
        download_link.download = csv_filename;
        document.documentElement.appendChild(download_link);
        download_link.click();
        download_link.remove();
    };

const
    header_csv_line = create_csv_line(headers.map(head =&amp;gt; head.name)),
    playlist_name = document.querySelector('music-detail-header.hydrated[label]').getAttribute('headline'),
    music_info_list = [...document.querySelectorAll('music-image-row.hydrated[data-key]')].map((row, index) =&amp;gt; {
        const
            music_title = row.getAttribute('primary-text') ?? '',
            music_url = row.getAttribute('primary-href'),
            artists = row.getAttribute('secondary-text-1') ?? '',
            artists_url = row.getAttribute('secondary-href-1'),
            album_title = row.getAttribute('secondary-text-2') ?? '',
            album_url = row.getAttribute('secondary-href-2'),
            list_type = 'Playlist',
            isrc = '',
            asin = (music_url.match(/trackAsin=([A-Z0-9]+)/) ?? [0,''])[1];
            
        return {
            no: index+1,
            music_title,
            music_url: music_url ? new URL(music_url,location.href).href : '',
            artists,
            artists_url: artists_url ? new URL(artists_url,location.href).href : '',
            album_title,
            album_url: album_url ? new URL(album_url,location.href).href : '',
            list_type,
            playlist_name,
            isrc,
            asin,
        };
    }),
    csv_lines = [header_csv_line].concat(music_info_list.map(music_info =&amp;gt; create_csv_line(headers.map(header =&amp;gt; music_info[header.key]))));

download_csv(`${playlist_name}.csv`, csv_lines);
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/kOPl-_-QgsAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/kOPl-_-QgsAA</link>
    <dc:date>2024-02-19T11:39:43Z</dc:date>
    <description>Amazon MusicのプレイリストをCSV形式でダウンロード</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] プレイリスト取得</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20headers%3D%5B%7Bkey%3A%27no%27%2Cname%3A%27No.%27%7D%2C%7Bkey%3A%27music_title%27%2Cname%3A%27%E6%9B%B2%27%7D%2C%7Bkey%3A%27music_url%27%2Cname%3A%27%E6%9B%B2URL%27%7D%2C%7Bkey%3A%27artists%27%2Cname%3A%27%E3%82%A2%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%27%7D%2C%7Bkey%3A%27artists_url%27%2Cname%3A%27%E3%82%A2%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88URL%27%7D%2C%7Bkey%3A%27album_title%27%2Cname%3A%27%E3%82%A2%E3%83%AB%E3%83%90%E3%83%A0%27%7D%2C%7Bkey%3A%27album_url%27%2Cname%3A%27%E3%82%A2%E3%83%AB%E3%83%90%E3%83%A0URL%27%7D%5D%2Ccreate_csv_line%3Dvalues%3D%3Evalues.map%28%28value%3D%3E%60%22%24%7B%28%27%27%2Bvalue%29.replace%28%2F%22%2Fg%2C%27%22%22%27%29%7D%22%60%29%29.join%28%27%2C%27%29%2Cdownload_csv%3D%28csv_filename%2Ccsv_lines%29%3D%3E%7Bconst%20csv_text%3Dcsv_lines.join%28%27%5Cr%5Cn%27%29%2Cbom%3Dnew%20Uint8Array%28%5B239%2C187%2C191%5D%29%2Cblob%3Dnew%20Blob%28%5Bbom%2Ccsv_text%5D%2C%7Btype%3A%27text%2Fcsv%27%7D%29%2Cblob_url%3DURL.createObjectURL%28blob%29%2Cdownload_link%3Ddocument.createElement%28%27a%27%29%3Bdownload_link.href%3Dblob_url%3Bdownload_link.download%3Dcsv_filename%3Bdocument.documentElement.appendChild%28download_link%29%3Bdownload_link.click%28%29%3Bdownload_link.remove%28%29%7D%3Bconst%20header_csv_line%3Dcreate_csv_line%28headers.map%28%28head%3D%3Ehead.name%29%29%29%2Cplaylist_title%3Ddocument.querySelector%28%27music-detail-header.hydrated%5Blabel%5D%27%29.getAttribute%28%27headline%27%29%2Cmusic_info_list%3D%5B...document.querySelectorAll%28%27music-image-row.hydrated%5Bdata-key%5D%27%29%5D.map%28%28%28row%2Cindex%29%3D%3E%7Bconst%20music_title%3Drow.getAttribute%28%27primary-text%27%29%3F%3F%27%27%2Cmusic_url%3Drow.getAttribute%28%27primary-href%27%29%2Cartists%3Drow.getAttribute%28%27secondary-text-1%27%29%3F%3F%27%27%2Cartists_url%3Drow.getAttribute%28%27secondary-href-1%27%29%2Calbum_title%3Drow.getAttribute%28%27secondary-text-2%27%29%3F%3F%27%27%2Calbum_url%3Drow.getAttribute%28%27secondary-href-2%27%29%3Breturn%7Bno%3Aindex%2B1%2Cmusic_title%3Amusic_title%2Cmusic_url%3Amusic_url%3Fnew%20URL%28music_url%2Clocation.href%29.href%3A%27%27%2Cartists%3Aartists%2Cartists_url%3Aartists_url%3Fnew%20URL%28artists_url%2Clocation.href%29.href%3A%27%27%2Calbum_title%3Aalbum_title%2Calbum_url%3Aalbum_url%3Fnew%20URL%28album_url%2Clocation.href%29.href%3A%27%27%7D%7D%29%29%2Ccsv_lines%3D%5Bheader_csv_line%5D.concat%28music_info_list.map%28%28music_info%3D%3Ecreate_csv_line%28headers.map%28%28header%3D%3Emusic_info%5Bheader.key%5D%29%29%29%29%29%29%3Bdownload_csv%28%60%24%7Bplaylist_title%7D.csv%60%2Ccsv_lines%29%7D%29%28%29%3B"&gt;プレイリスト取得&lt;/a&gt;&lt;pre&gt;/*
 * @title プレイリスト取得
 * @description Amazon MusicのプレイリストをCSV形式でダウンロード
 * @include https://music.amazon.co.jp/playlists/*
 * @include https://music.amazon.co.jp/my/playlists/*
 * @license MIT License
 * @javascript_url
 */
(() =&amp;gt; {
const
    headers = [
        {key: 'no', name: 'No.',},
        {key: 'music_title', name: '曲',},
        {key: 'music_url', name: '曲URL',},
        {key: 'artists', name: 'アーティスト',},
        {key: 'artists_url', name: 'アーティストURL',},
        {key: 'album_title', name: 'アルバム',},
        {key: 'album_url', name: 'アルバムURL',},
    ],
    create_csv_line = values =&amp;gt; values.map(value =&amp;gt; `&amp;quot;${('' + value).replace(/&amp;quot;/g, '&amp;quot;&amp;quot;')}&amp;quot;` ).join(','),
    download_csv = (csv_filename, csv_lines) =&amp;gt; {
        const
            csv_text = csv_lines.join('\r\n'),
            bom = new Uint8Array([0xEF, 0xBB, 0xBF]),
            blob = new Blob([bom, csv_text], {'type': 'text/csv'}),
            blob_url = URL.createObjectURL(blob),
            download_link = document.createElement('a');
        
        download_link.href = blob_url;
        download_link.download = csv_filename;
        document.documentElement.appendChild(download_link);
        download_link.click();
        download_link.remove();
    };

const
    header_csv_line = create_csv_line(headers.map(head =&amp;gt; head.name)),
    playlist_title = document.querySelector('music-detail-header.hydrated[label]').getAttribute('headline'),
    music_info_list = [...document.querySelectorAll('music-image-row.hydrated[data-key]')].map((row, index) =&amp;gt; {
        const
            music_title = row.getAttribute('primary-text') ?? '',
            music_url = row.getAttribute('primary-href'),
            artists = row.getAttribute('secondary-text-1') ?? '',
            artists_url = row.getAttribute('secondary-href-1'),
            album_title = row.getAttribute('secondary-text-2') ?? '',
            album_url = row.getAttribute('secondary-href-2');
            
        return {
            no: index+1,
            music_title,
            music_url: music_url ? new URL(music_url,location.href).href : '',
            artists,
            artists_url: artists_url ? new URL(artists_url,location.href).href : '',
            album_title,
            album_url: album_url ? new URL(album_url,location.href).href : '',
        };
    }),
    csv_lines = [header_csv_line].concat(music_info_list.map(music_info =&amp;gt; create_csv_line(headers.map(header =&amp;gt; music_info[header.key]))));

download_csv(`${playlist_title}.csv`, csv_lines);
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/kLvm7Oz0gOAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/kLvm7Oz0gOAA</link>
    <dc:date>2023-12-19T08:36:39Z</dc:date>
    <description>Twitter(X)のユーザープロフィールからメディア検索画面に遷移する</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] メディア検索画面に遷移</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20media_tab%3Ddocument.querySelector%28%27%5Brole%3D%22presentation%22%5D%20a%5Bhref%24%3D%22%2Fmedia%22%5D%5Brole%3D%22tab%22%5D%27%29%3Bif%28%21media_tab%29%7Breturn%7Dconst%20username%3Dmedia_tab.href.match%28%2F%28%5B%5E%2F%5D%2A%29%5C%2Fmedia%24%2F%29%5B1%5D%2Cquery%3D%60from%3A%24%7Busername%7D%20%28filter%3Amedia%20OR%20card_name%3Aanimated_gif%29%60%2Csearch_url%3D%60%2Fsearch%3Fq%3D%24%7BencodeURIComponent%28query%29%7D%26src%3Dtyped_query%26f%3Dlive%60%2Curl_object%3Dnew%20URL%28search_url%2Clocation.href%29%3Btry%7Bconst%20previous_url_object%3Dnew%20URL%28location.href%29%2Cstate%3D%7Bkey%3A%27r80bpk%27%2Cstate%3A%7BfromApp%3Atrue%2CpreviousPath%3Aprevious_url_object.pathname%2Bprevious_url_object.search%7D%7D%2Cpop_state_event%3Dnew%20PopStateEvent%28%27popstate%27%2C%7Bstate%3Astate%7D%29%3Bhistory.pushState%28state%2C%27%27%2Curl_object.pathname%2Burl_object.search%29%3BdispatchEvent%28pop_state_event%29%7Dcatch%28error%29%7Blocation.href%3Dsearch_url%7D%7D%29%28%29%3B"&gt;メディア検索画面に遷移&lt;/a&gt;&lt;pre&gt;/*
 * @title メディア検索画面に遷移
 * @description Twitter(X)のユーザープロフィールからメディア検索画面に遷移する
 * @include https://twitter.com/*
 * @include https://x.com/*
 * @license MIT License
 * @javascript_url
 */

(() =&amp;gt; {
'use strict';

const
    media_tab = document.querySelector('[role=&amp;quot;presentation&amp;quot;] a[href$=&amp;quot;/media&amp;quot;][role=&amp;quot;tab&amp;quot;]');

if (! media_tab) {
    return;
}

const
    username = media_tab.href.match(/([^/]*)\/media$/)[1],
    query = `from:${username} (filter:media OR card_name:animated_gif)`,
    search_url = `/search?q=${encodeURIComponent(query)}&amp;amp;src=typed_query&amp;amp;f=live`,
    url_object = new URL(search_url, location.href);

try {
    const
        previous_url_object = new URL(location.href),
        state = {
            key: 'r80bpk',
            state: {
                fromApp: true,
                previousPath: previous_url_object.pathname + previous_url_object.search,
            },
        },
        pop_state_event = new PopStateEvent('popstate', {state: state});
    
    history.pushState(state, '', url_object.pathname + url_object.search);
    dispatchEvent(pop_state_event);
}
catch (error) {
    location.href = search_url;
}

})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/hJmdpf3zhZcA">
    <link>https://let.hatelabo.jp/furyu-tei/let/hJmdpf3zhZcA</link>
    <dc:date>2023-11-11T02:47:49Z</dc:date>
    <description>Twitterの個別ツイート(https://twitter.com/&lt;name&gt;/status/&lt;id&gt;)のURL(&lt;id&gt;)からおおよその投稿時刻を取得(2010年11月4日22時(UTC)以降のもの)</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] ツイートID→時刻変換</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20twitter_epoch_time%3D1288834974657n%2Cthreshold_tweet_id%3D300000000000000n%3Blet%20tweet_id%3D%28new%20URL%28location.href%29.pathname.match%28%2F%5E%5C%2F%5B%5E%2F%5D%2B%5C%2Fstatus%5C%2F%28%5Cd%2B%29%2F%29%7C%7C%5B%5D%29%5B1%5D%3Bif%28%21tweet_id%29%7Btweet_id%3Dprompt%28%27Tweet%20ID%27%29%3Bif%28%21tweet_id%29%7Breturn%7D%7Dtweet_id%3DBigInt%28tweet_id%29%3Bif%28tweet_id%3Cthreshold_tweet_id%29%7Balert%28%60Unsupported%20Tweet%20ID%3A%20%24%7Btweet_id%7D%20%28%3C%20%24%7Bthreshold_tweet_id%7D%2C%20before%202010%2F11%2F04%29%60%29%3Breturn%7Dlet%20timestamp_ms%3DNumber%28twitter_epoch_time%2B%28tweet_id%3E%3E22n%29%29%2Cdate_obj%3Dnew%20Date%28timestamp_ms%29%2Ciso_timestring%3Ddate_obj.toISOString%28%29.replace%28%2F%5C.%5Cd%2BZ%24%2F%2C%27Z%27%29%3Bdate_obj.setMinutes%28date_obj.getMinutes%28%29-date_obj.getTimezoneOffset%28%29%29%3Blet%20timestring%3Ddate_obj.toISOString%28%29.replace%28%2FT%2F%2C%27%20%27%29.replace%28%2F%5C.%5Cd%2BZ%24%2F%2C%27%27%29%2Cprompt_text%3D%60%5Cn%5BTweet%20ID%5D%20%24%7Btweet_id%7D%5Cn%5BISO%208601%5D%20%24%7Biso_timestring%7D%60%2Cresult%3Dprompt%28prompt_text%2Ctimestring%29%3Bif%28result%21%3D%3Dnull%29%7Bnavigator.clipboard.writeText%28result%29.catch%28%28error%3D%3Econsole.info%28%60Copy%20to%20clipboard%20failed.%20%28%24%7Berror%7D%29%60%29%29%29.then%28%28%28%29%3D%3Econsole.debug%28%60Copy%20to%20clipboard%20succeeded.%20%28%24%7Bresult%7D%29%60%29%29%29%7D%7D%29%28%29%3B"&gt;ツイートID→時刻変換&lt;/a&gt;&lt;pre&gt;/*
 * @title ツイートID→時刻変換
 * @description Twitterの個別ツイート(https://twitter.com/&amp;lt;name&amp;gt;/status/&amp;lt;id&amp;gt;)のURL(&amp;lt;id&amp;gt;)からおおよその投稿時刻を取得(2010年11月4日22時(UTC)以降のもの)
 * @include https://twitter.com/*
 * @license MIT License
 * @javascript_url
 */

(()=&amp;gt;{
'use strict';
const
    twitter_epoch_time = 1288834974657n, // https://www.slideshare.net/pfi/id-15755280
    threshold_tweet_id = 300000000000000n;

let tweet_id = (new URL(location.href).pathname.match(/^\/[^/]+\/status\/(\d+)/)||[])[1];
if (! tweet_id) {
    tweet_id = prompt('Tweet ID');
    if (! tweet_id) {
        return;
    }
}
tweet_id = BigInt(tweet_id);
if (tweet_id &amp;lt; threshold_tweet_id) {
    alert(`Unsupported Tweet ID: ${tweet_id} (&amp;lt; ${threshold_tweet_id}, before 2010/11/04)`);
    return;
}
let timestamp_ms = Number(twitter_epoch_time + (tweet_id&amp;gt;&amp;gt;22n)),
    date_obj = new Date(timestamp_ms),
    iso_timestring = date_obj.toISOString().replace(/\.\d+Z$/, 'Z');
date_obj.setMinutes(date_obj.getMinutes() - date_obj.getTimezoneOffset());
let timestring = date_obj.toISOString().replace(/T/, ' ').replace(/\.\d+Z$/, ''),
    prompt_text = `
[Tweet ID] ${tweet_id}
[ISO 8601] ${iso_timestring}`,
    result = prompt(prompt_text, timestring);
if (result !== null) {
    navigator.clipboard.writeText(result)
    .catch(error =&amp;gt; console.info(`Copy to clipboard failed. (${error})`))
    // TODO: Firefox だとエラーになる (90.0.2)
    //  Uncaught (in promise) DOMException: Clipboard write was blocked due to lack of user activation.
    .then(() =&amp;gt; console.debug(`Copy to clipboard succeeded. (${result})`));
}
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/j9W0mKmGgKAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/j9W0mKmGgKAA</link>
    <dc:date>2023-07-13T07:01:09Z</dc:date>
    <description>Kindleの個別商品ページからKindle Cloud Readerを開く</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] OpenKCR</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20is_kindle_page%3D%28%29%3D%3E%7Bconst%20kindle_mark%3Ddocument.querySelector%28%27%23bylineInfo%20%3E%20span%3Anth-child%285%29%27%29%3F.textContent%3Breturn%21%21%28kindle_mark%26%26%2FKindle%2Fi.test%28kindle_mark%29%29%7D%3Bif%28%21is_kindle_page%28%29%29return%3Bconst%20asin%3Ddocument.querySelector%28%27%23detailBullets_feature_div%20%3E%20ul.detail-bullet-list%20%3E%20li%3Afirst-child%20%3E%20span.a-list-item%20%3E%20span%3Alast-child%27%29%3F.textContent.trim%28%29%3Bif%28%21asin%29return%3Bwindow.open%28%60https%3A%2F%2Fread.amazon.co.jp%2Fkindle-library%2Fmanga-wr%2F%24%7Basin%7D%60%29%7D%29%28%29%3B"&gt;OpenKCR&lt;/a&gt;&lt;pre&gt;/*
 * @title OpenKCR
 * @description Kindleの個別商品ページからKindle Cloud Readerを開く
 * @include https://www.amazon.co.jp/*
 * @license MIT License
 * @javascript_url
 */
(() =&amp;gt; {
const
    is_kindle_page = () =&amp;gt; {
        const
            kindle_mark = document.querySelector('#bylineInfo &amp;gt; span:nth-child(5)')?.textContent;
        return !! (kindle_mark &amp;amp;&amp;amp; /Kindle/i.test(kindle_mark));
    };
if (! is_kindle_page()) return;
const
    asin = document.querySelector('#detailBullets_feature_div &amp;gt; ul.detail-bullet-list &amp;gt; li:first-child &amp;gt; span.a-list-item &amp;gt; span:last-child')?.textContent.trim();
if (! asin) return;
window.open(`https://read.amazon.co.jp/kindle-library/manga-wr/${asin}`);
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/ivDEh__8gKAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/ivDEh__8gKAA</link>
    <dc:date>2023-04-05T02:06:36Z</dc:date>
    <description>マイクロソフトのサポートページで日本語ページ⇔英語ページを切り替える</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] MS日英切替</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Blet%20matches%3Dlocation.href.match%28%2F%5Ehttps%3F%3A%5C%2F%5C%2F%28docs%7Csupport%7Clearn%29%5C.microsoft%5C.com%5C%2F%28.%2B%3F%29-%28.%2B%3F%29%5C%2F%2F%29%3Bif%28%21matches%29return%3Blet%20page_category%3Dmatches%5B1%5D%2Ccurrent_lang%3Dmatches%5B2%5D.toLowerCase%28%29%2B%27-%27%2Bmatches%5B3%5D.toUpperCase%28%29%2Cto_lang%3Dcurrent_lang%3D%3D%27ja-JP%27%3F%27en-US%27%3A%27ja-JP%27%3Bswitch%28page_category%29%7Bcase%27docs%27%3Acase%27learn%27%3A%7Blocation.href%3Dlocation.href.replace%28new%20RegExp%28current_lang%2C%27i%27%29%2Cto_lang.toLowerCase%28%29%29%3Bbreak%7Dcase%27support%27%3A%7Bfetch%28%27https%3A%2F%2Fsupport.microsoft.com%2F%27%2Bcurrent_lang%2B%27%2Fworldwide%3F%27%2BencodeURIComponent%28location.href%29%29.then%28%28response%3D%3Eresponse.text%28%29%29%29.then%28%28html%3D%3E%7Blet%20doc%3D%28new%20DOMParser%29.parseFromString%28html%2C%22text%2Fhtml%22%29%3Blocation.href%3Ddoc.querySelector%28%27a%5Bdata-bi-name%3D%22lp_culture_link%22%5D%5Bhref%2A%3D%22%2F%27%2Bto_lang%2B%27%2F%22%5D%27%29.href%7D%29%29.catch%28%28error%3D%3Eerror%29%29%3Bbreak%7D%7D%7D%29%28%29%3B"&gt;MS日英切替&lt;/a&gt;&lt;pre&gt;/*
 * @title MS日英切替
 * @description マイクロソフトのサポートページで日本語ページ⇔英語ページを切り替える
 * @include https://support.microsoft.com/*
 * @include https://docs.microsoft.com/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

( () =&amp;gt; {
let matches = location.href.match( /^https?:\/\/(docs|support|learn)\.microsoft\.com\/(.+?)-(.+?)\// );

if ( ! matches ) return;

let page_category = matches[ 1 ],
    current_lang = matches[ 2 ].toLowerCase() + '-' + matches[ 3 ].toUpperCase(),
    to_lang = ( current_lang == 'ja-JP' ) ? 'en-US' : 'ja-JP';

switch ( page_category ) {
    case 'docs' :
    case 'learn': {
        location.href = location.href.replace( new RegExp( current_lang, 'i' ), to_lang.toLowerCase() );
        break;
    }
    case 'support' : {
        fetch( 'https://support.microsoft.com/' + current_lang + '/worldwide?' + encodeURIComponent( location.href ) )
        .then( response =&amp;gt; response.text() )
        .then( html =&amp;gt; {
            let doc =  new DOMParser().parseFromString( html, &amp;quot;text/html&amp;quot; );
            
            location.href = doc.querySelector( 'a[data-bi-name=&amp;quot;lp_culture_link&amp;quot;][href*=&amp;quot;/' + to_lang + '/&amp;quot;]' ).href;
        } )
        .catch( error =&amp;gt; error );
        break;
    }
}
} )();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/jYvYlf7QgYAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/jYvYlf7QgYAA</link>
    <dc:date>2022-02-16T03:37:26Z</dc:date>
    <description>現在のページのURLとタイトルをリンク記法でコピー</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] リンク記法作成</title>
    <content:encoded>&lt;a href="javascript:%28%28title%2Curl%29%3D%3E%7B%27use%20strict%27%3Bconst%20copy_to_clipboard%3Dtext_to_copy%3D%3E%7Bif%28navigator.clipboard%26%26window.isSecureContext%29%7Breturn%20navigator.clipboard.writeText%28text_to_copy%29%7Dconst%20work_textarea%3D%28%28%29%3D%3E%7Bconst%20textarea%3Ddocument.createElement%28%27textarea%27%29%2Cstyle%3Dtextarea.style%3Bstyle.position%3D%22absolute%22%3Bstyle.left%3D0%3Bstyle.top%3D0%3Bstyle.width%3D0%3Bstyle.height%3D0%3Bstyle.visibility%3D%27hidden%27%3Breturn%20textarea%7D%29%28%29%3Bwork_textarea.value%3Dtext_to_copy%3Bdocument.documentElement.appendChild%28work_textarea%29%3Bwork_textarea.select%28%29%3Breturn%20new%20Promise%28%28%28resolve%2Creject%29%3D%3E%7Bif%28document.execCommand%28%27copy%27%29%29%7Bresolve%28%29%7Delse%7Breject%28%29%7Dwork_textarea.remove%28%29%7D%29%29%7D%2Cmessage%3D%60%5B%24%7Btitle%7D%5D%28%24%7Burl%7D%29%60%3Bcopy_to_clipboard%28message%29.then%28%28%28%29%3D%3E%7Balert%28%60%24%7Bmessage%7D%5Cn%3D%3E%20Copied%20to%20clipboard.%60%29%7D%29%29.catch%28%28error%3D%3E%7Bconsole.error%28error%29%3Bprompt%28title%2Cmessage%29%7D%29%29%7D%29%28document.title%2Clocation.href%29%3B"&gt;リンク記法作成&lt;/a&gt;&lt;pre&gt;/*
 * @title リンク記法作成
 * @description 現在のページのURLとタイトルをリンク記法でコピー
 * @include http://*
 * @include https://*
 * @license MIT License
 * @javascript_url
 */
((title, url) =&amp;gt; {
'use strict';
const
    copy_to_clipboard = (text_to_copy) =&amp;gt; {
        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {
            return navigator.clipboard.writeText(text_to_copy);
        }
        const
            work_textarea = (() =&amp;gt; {
                const
                    textarea = document.createElement('textarea'),
                    style = textarea.style;
                style.position = &amp;quot;absolute&amp;quot;;
                style.left = 0;
                style.top = 0;
                style.width = 0;
                style.height = 0;
                style.visibility = 'hidden';
                return textarea;
            })();
        
        work_textarea.value = text_to_copy;
        document.documentElement.appendChild(work_textarea);
        //work_textarea.focus();
        work_textarea.select();
        
        return new Promise((resolve, reject) =&amp;gt; {
            if (document.execCommand('copy')) {
                resolve();
            }
            else {
                reject();
            }
            work_textarea.remove();
        });
    },
    message = `[${title}](${url})`;
    
copy_to_clipboard(message)
.then(() =&amp;gt; {
    alert(`${message}\n=&amp;gt; Copied to clipboard.`);
})
.catch((error) =&amp;gt; {
    console.error(error);
    prompt(title, message);
});
})(document.title, location.href);
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/jP6Y1ITYgcAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/jP6Y1ITYgcAA</link>
    <dc:date>2022-01-26T03:06:41Z</dc:date>
    <description>Google検索等で付加されるScroll To Text Fragment(#:~:text=～)を除去</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] Text Fragments除去</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20url_object%3Dnew%20URL%28location.href%29%3Bif%28%21%2F%5E%23%3A~%3Atext%3D%2F.test%28decodeURIComponent%28url_object.hash%29%29%29return%3Burl_object.hash%3D%27%27%3Blocation.href%3Durl_object.href%7D%29%28%29%3B"&gt;Text Fragments除去&lt;/a&gt;&lt;pre&gt;/*
 * @title Text Fragments除去
 * @description Google検索等で付加されるScroll To Text Fragment(#:~:text=～)を除去
 * @include http://*
 * @include https://*
 * @license MIT License
 * @javascript_url
 */
(()=&amp;gt;{
'use strict';
const
    url_object = new URL(location.href);
if (! /^#:~:text=/.test(decodeURIComponent(url_object.hash))) return;
url_object .hash = '';
location.href = url_object.href;
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/i92Q_LjAgMAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/i92Q_LjAgMAA</link>
    <dc:date>2021-05-21T08:25:34Z</dc:date>
    <description>メディア（画像・動画）付きツイートをスタンプ風に引用（=メディアのみ引用）してツイート（個別ツイートを開いた状態で使います）</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] #なんちゃってツイートスタンプ</title>
    <content:encoded>&lt;a href="javascript:%28async%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20tweet_urlobj%3Dnew%20URL%28location.href%29%2Cmatches%3Dtweet_urlobj.pathname.match%28%2F%5E%5C%2F%28%5B%5E%2F%5D%2B%29%5C%2Fstatus%5C%2F%28%5Cd%2B%29%2F%29%2Cscreen_name%3Dmatches%3F.%5B1%5D%2Ctweet_id%3Dmatches%3F.%5B2%5D%3Bif%28%21%2F%5B%2F.%5Dtwitter%5C.com%24%2F.test%28tweet_urlobj.origin%29%7C%7C%21screen_name%7C%7C%21tweet_id%29%7Balert%28%27Unsupported%20page%20%21%27%29%3Breturn%7Dconst%20fetch_result%3Dawait%20fetch%28%60%24%7Btweet_urlobj.origin%7D%2Fi%2Fapi%2F2%2Ftimeline%2Fconversation%2F%24%7Btweet_id%7D.json%3Finclude_profile_interstitial_type%3D1%26include_blocking%3D1%26include_blocked_by%3D1%26include_followed_by%3D1%26include_want_retweets%3D1%26include_mute_edge%3D1%26include_can_dm%3D1%26include_can_media_tag%3D1%26skip_status%3D1%26cards_platform%3DWeb-12%26include_cards%3D1%26include_ext_alt_text%3Dtrue%26include_quote_count%3Dtrue%26include_reply_count%3D1%26tweet_mode%3Dextended%26include_entities%3Dtrue%26include_user_entities%3Dtrue%26include_ext_media_color%3Dtrue%26include_ext_media_availability%3Dtrue%26send_error_codes%3Dtrue%26simple_quoted_tweet%3Dtrue%26referrer%3Dtweet%26controller_data%3DDAACDAAEDAABCgABAAX2IAGQCCEAAAAA%26count%3D20%26include_ext_has_birdwatch_notes%3Dfalse%26ext%3DmediaStats%252ChighlightedLabel%60%2C%7Bmethod%3A%27GET%27%2Cheaders%3A%7Bauthorization%3A%27Bearer%20AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%253D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA%27%2C%27x-csrf-token%27%3Adocument.cookie.match%28%2Fct0%3D%28.%2A%3F%29%28%3F%3A%3B%7C%24%29%2F%29%5B1%5D%2C%27x-twitter-active-user%27%3A%27yes%27%2C%27x-twitter-auth-type%27%3A%27OAuth2Session%27%2C%27x-twitter-client-language%27%3A%27en%27%7D%2Cmode%3A%27cors%27%2Ccredentials%3A%27include%27%7D%29.then%28%28result%3D%3Eresult.json%28%29%29%29.catch%28%28error%3D%3Eerror%29%29%2Cfirst_media%3Dfetch_result%3F.globalObjects%3F.tweets%3F.%5Btweet_id%5D%3F.extended_entities%3F.media%3F.%5B0%5D%2Cfirst_media_url%3Dfirst_media%3F.expanded_url%3Bif%28%21first_media_url%29%7Balert%28%27Media%20not%20found%20%21%27%29%3Breturn%7Dconst%20hash_tag%3Ddocument.documentElement.lang%3D%3D%27ja%27%3F%27%E3%81%AA%E3%82%93%E3%81%A1%E3%82%83%E3%81%A3%E3%81%A6%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%27%3A%27PseudoTweetStamp%27%2Ccredit_screen_name%3Dnew%20URL%28first_media_url%29.pathname.match%28%2F%5C%2F%28%5B%5E%2F%5D%2B%29%2F%29%3F.%5B1%5D%3F%3Fscreen_name%2Ctweet_text%3D%60%23%24%7Bhash_tag%7D%20by%20%24%7Bcredit_screen_name%7D%60%2Ctweet_input_url%3D%60%24%7Btweet_urlobj.origin%7D%2Fintent%2Ftweet%3Ftext%3D%60%2BencodeURIComponent%28tweet_text%29%2B%27%26url%3D%27%2BencodeURIComponent%28first_media_url%29%2Cstate%3D%7Bkey%3A%27r80bpk%27%2Cstate%3A%7BfromApp%3Atrue%2CpreviousPath%3Atweet_urlobj.pathname%7D%7D%2Cpop_state_event%3Dnew%20PopStateEvent%28%27popstate%27%2C%7Bstate%3Astate%7D%29%3Bhistory.pushState%28state%2C%27%27%2Ctweet_input_url%29%3BdispatchEvent%28pop_state_event%29%7D%29%28%29%3B"&gt;#なんちゃってツイートスタンプ&lt;/a&gt;&lt;pre&gt;/*
 * @title #なんちゃってツイートスタンプ
 * @description メディア（画像・動画）付きツイートをスタンプ風に引用（=メディアのみ引用）してツイート（個別ツイートを開いた状態で使います）
 * @include https://twitter.com/*
 * @include https://mobile.twitter.com/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

(async ()=&amp;gt;{
'use strict';
const
    tweet_urlobj = new URL(location.href),
    matches = tweet_urlobj.pathname.match(/^\/([^/]+)\/status\/(\d+)/),
    screen_name = matches?.[1],
    tweet_id = matches?.[2];

if ((! /[/.]twitter\.com$/.test(tweet_urlobj.origin)) || (! screen_name) || (! tweet_id)) {
    alert('Unsupported page !');
    return;
}
const
    fetch_result = await fetch(`${tweet_urlobj.origin}/i/api/2/timeline/conversation/${tweet_id}.json?include_profile_interstitial_type=1&amp;amp;include_blocking=1&amp;amp;include_blocked_by=1&amp;amp;include_followed_by=1&amp;amp;include_want_retweets=1&amp;amp;include_mute_edge=1&amp;amp;include_can_dm=1&amp;amp;include_can_media_tag=1&amp;amp;skip_status=1&amp;amp;cards_platform=Web-12&amp;amp;include_cards=1&amp;amp;include_ext_alt_text=true&amp;amp;include_quote_count=true&amp;amp;include_reply_count=1&amp;amp;tweet_mode=extended&amp;amp;include_entities=true&amp;amp;include_user_entities=true&amp;amp;include_ext_media_color=true&amp;amp;include_ext_media_availability=true&amp;amp;send_error_codes=true&amp;amp;simple_quoted_tweet=true&amp;amp;referrer=tweet&amp;amp;controller_data=DAACDAAEDAABCgABAAX2IAGQCCEAAAAA&amp;amp;count=20&amp;amp;include_ext_has_birdwatch_notes=false&amp;amp;ext=mediaStats%2ChighlightedLabel`, {
            method: 'GET',
            headers: {
                'authorization' : 'Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA',
                'x-csrf-token' : document.cookie.match( /ct0=(.*?)(?:;|$)/ )[ 1 ],
                'x-twitter-active-user' : 'yes',
                'x-twitter-auth-type' : 'OAuth2Session',
                'x-twitter-client-language' : 'en',
            },
            mode: 'cors',
            credentials: 'include',
        }
    ).then(result =&amp;gt; result.json()).catch(error =&amp;gt; error),
    first_media = fetch_result?.globalObjects?.tweets?.[tweet_id]?.extended_entities?.media?.[0],
    first_media_url = first_media?.expanded_url;
if (! first_media_url) {
    alert('Media not found !');
    return;
}

const
    hash_tag = (document.documentElement.lang == 'ja') ? 'なんちゃってツイートスタンプ' : 'PseudoTweetStamp',
    credit_screen_name = new URL(first_media_url).pathname.match(/\/([^/]+)/)?.[1] ?? screen_name,
    tweet_text = `#${hash_tag} by ${credit_screen_name}`,
    tweet_input_url = `${tweet_urlobj.origin}/intent/tweet?text=` + encodeURIComponent(tweet_text) + '&amp;amp;url=' + encodeURIComponent(first_media_url),
    state = {
        key: 'r80bpk',
        state: {
            fromApp: true,
            previousPath: tweet_urlobj.pathname,
        },
    },
    pop_state_event = new PopStateEvent('popstate', { state : state });
history.pushState(state, '', tweet_input_url);
dispatchEvent( pop_state_event );
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/iu6czrPagKAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/iu6czrPagKAA</link>
    <dc:date>2020-12-06T11:50:07Z</dc:date>
    <description>今後は https://greasyfork.org/ja/scripts/417287-twfleetcapture 参照（Twitterユーザープロフィール画面にて該当ユーザーのFleet画像があればそれを別タブに開く）</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] Fleet画像を開く</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20fetch_api%3Dapi_url%3D%3Efetch%28api_url%2C%7Bmethod%3A%27GET%27%2Cheaders%3A%7Bauthorization%3A%27Bearer%20AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%253D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA%27%2C%27x-csrf-token%27%3Adocument.cookie.match%28%2Fct0%3D%28.%2A%3F%29%28%3F%3A%3B%7C%24%29%2F%29%5B1%5D%2C%27x-twitter-active-user%27%3A%27yes%27%2C%27x-twitter-auth-type%27%3A%27OAuth2Session%27%2C%27x-twitter-client-language%27%3A%27en%27%7D%2Cmode%3A%27cors%27%2Ccredentials%3A%27include%27%7D%29%3Blet%20screen_name%3D%28document.title.match%28%2F%5C%28%40%28.%2B%29%5C%29%2F%29%7C%7C%5B%5D%29%5B1%5D%7C%7Cprompt%28%27Input%20screen%20name%20of%20user%27%2C%27%27%29%3Bif%28screen_name%3D%3D%3Dnull%29return%3Bscreen_name%3Dscreen_name.trim%28%29.replace%28%2F%5E%40%2F%2C%27%27%29%3Bif%28%21screen_name%29return%3Bfetch_api%28%27https%3A%2F%2Fapi.twitter.com%2F1.1%2Fusers%2Fshow.json%3Fscreen_name%3D%27%2BencodeURIComponent%28screen_name%29%29.then%28%28response%3D%3E%7Bif%28%21response.ok%29%7Bthrow%20new%20Error%28%27Network%20response%20was%20not%20ok%27%29%7Dreturn%20response.json%28%29%7D%29%29.then%28%28user_info%3D%3E%7Blet%20user_id%3Duser_info.id_str%3Bif%28%21user_id%29%7Bthrow%20new%20Error%28%27Response%20does%20not%20include%20the%20ID%20of%20the%20user%27%29%7Dfetch_api%28%27https%3A%2F%2Fapi.twitter.com%2Ffleets%2Fv1%2Fuser_fleets%3Fuser_id%3D%27%2BencodeURIComponent%28user_id%29%29.then%28%28response%3D%3E%7Bif%28%21response.ok%29%7Bthrow%20new%20Error%28%27Network%20response%20was%20not%20ok%27%29%7Dreturn%20response.json%28%29%7D%29%29.then%28%28fleet_info%3D%3E%7Btry%7Blet%20fleets%3Dfleet_info.fleet_threads%5B0%5D.fleets%3Bif%28fleets.length%3C1%29%7Bthrow%20new%20Error%28%27no%20fleet%27%29%7Dfleets.map%28%28fleet%3D%3E%7Bwindow.open%28fleet.media_entity.media_url_https%29%7D%29%29%7Dcatch%28error%29%7Balert%28%27No%20fleet%20found.%27%29%7D%7D%29%29.catch%28%28error%3D%3E%7Bconsole.error%28screen_name%2Cerror%29%3Balert%28%27Fleet%20information%20of%20%22%27%2Bscreen_name%2B%27%22%20is%20not%20found%3A%20%27%2Berror%29%7D%29%29%7D%29%29.catch%28%28error%3D%3E%7Bconsole.error%28screen_name%2Cerror%29%3Balert%28%27%22%27%2Bscreen_name%2B%27%22%20is%20not%20found%3A%20%27%2Berror%29%7D%29%29%7D%29%28%29%3B"&gt;Fleet画像を開く&lt;/a&gt;&lt;pre&gt;/*
 * @title Fleet画像を開く
 * @description 今後は https://greasyfork.org/ja/scripts/417287-twfleetcapture 参照（Twitterユーザープロフィール画面にて該当ユーザーのFleet画像があればそれを別タブに開く）
 * @include https://twitter.com/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

( () =&amp;gt; {
'use strict';

const
    fetch_api = ( api_url ) =&amp;gt; {
        return fetch( api_url, {
            method: 'GET',
                headers: {
                'authorization' : 'Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA',
                'x-csrf-token' : document.cookie.match( /ct0=(.*?)(?:;|$)/ )[ 1 ],
                    'x-twitter-active-user' : 'yes',
                    'x-twitter-auth-type' : 'OAuth2Session',
                    'x-twitter-client-language' : 'en',
                },
                mode: 'cors',
                credentials : 'include',
            } );
    };

let screen_name =  ( document.title.match( /\(@(.+)\)/ ) || [] )[ 1 ] || prompt( 'Input screen name of user', '' );

if ( screen_name === null ) return;
screen_name = screen_name.trim().replace( /^@/, '' );
if ( ! screen_name ) return;

fetch_api( 'https://api.twitter.com/1.1/users/show.json?screen_name=' + encodeURIComponent( screen_name ) )
.then( response =&amp;gt; {
    if ( ! response.ok ) {
        throw new Error( 'Network response was not ok' );
    }
    return response.json()
} )
.then( user_info =&amp;gt; {
    let user_id = user_info.id_str;
    
    if ( ! user_id ) {
        throw new Error( 'Response does not include the ID of the user' );
    }
    
    fetch_api( 'https://api.twitter.com/fleets/v1/user_fleets?user_id=' + encodeURIComponent( user_id ) )
    .then( response =&amp;gt; {
        if ( ! response.ok ) {
            throw new Error( 'Network response was not ok' );
        }
        return response.json()
    } )
    .then( fleet_info =&amp;gt; {
        try {
            let fleets = fleet_info.fleet_threads[ 0 ].fleets;
            
            if ( fleets.length &amp;lt; 1 ) {
                throw new Error( 'no fleet' );
            }
            
            fleets.map( fleet =&amp;gt; {
                window.open( fleet.media_entity.media_url_https );
            } );
        }
        catch ( error ) {
            alert( 'No fleet found.' );
        }
    } )
    .catch( error =&amp;gt; {
        console.error( screen_name, error );
        alert( 'Fleet information of &amp;quot;' + screen_name + '&amp;quot; is not found: ' + error );
    } );
} )
.catch( error =&amp;gt; {
    console.error( screen_name, error );
    alert( '&amp;quot;' + screen_name + '&amp;quot; is not found: ' + error );
} );
} )();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/hJmf7tzjlu5j">
    <link>https://let.hatelabo.jp/furyu-tei/let/hJmf7tzjlu5j</link>
    <dc:date>2020-10-29T03:42:51Z</dc:date>
    <description>http://java.cocolog-nifty.com/blog/2005/10/javascript_c163.html の移植版(jQuery使用)</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] 「ココログ用検索」の検索ボックスを任意のココログに</title>
    <content:encoded>&lt;a href="javascript:%28function%28%29%7B%27use%20strict%27%3Bwindow.cocolog_ajax_search_options%3D%7Bcolor%3A%27%23ffcc33%27%2Ctruncation_length%3A80%2Centry_per_page%3A20%2Cmax_concurrent_load%3A10%2Cdisplay_search_form%3Atrue%2Clook_ahead%3Afalse%2Csearch_box_id%3A%27search_box%27%2Csearch_credit_id%3A%27search_credit%27%2Cdebug%3Atrue%7D%3Bfunction%20check%28%29%7Bvar%20%24%3Dwindow.jQuery%3Bif%28%21%24%29%7BsetTimeout%28check%2C100%29%3Breturn%7Dfunction%20addSearchForm%28%29%7Bvar%20form%3D%24%28%5B%27%3Cform%20onsubmit%3D%22cocologAjaxSearch%28%20null%2C%20jQuery%28%5C%27%23%27%2Bcocolog_ajax_search_options.search_box_id%2B%27%5C%27%29.val%28%29%20%29%3B%20return%20false%22%3E%27%2C%27%20%20%20%20%3Cinput%20type%3D%22search%22%20id%3D%22%27%2Bcocolog_ajax_search_options.search_box_id%2B%27%22%20name%3D%22search_box%22%20value%3D%22%22%20%20results%3D%225%22%20autosave%3D%22tangerine%22%20placeholder%3D%22%E6%A4%9C%E7%B4%A2%E8%AA%9E%E3%82%92%E5%85%A5%E5%8A%9B%22%20%2F%3E%27%2C%27%20%20%20%20%3Cinput%20type%3D%22submit%22%20value%3D%22%E6%A4%9C%E7%B4%A2%22%20%2F%3E%27%2C%27%20%20%20%20%3Cspan%20id%3D%22search_credit%22%20style%3D%22font-size%3A%20xx-small%3B%20margin-left%3A%204px%3B%22%3E%3C%2Fspan%3E%27%2C%27%3C%2Fform%3E%27%5D.join%28%27%5Cn%27%29%29%2Cold_form%3D%24%28%27%23%27%2Bcocolog_ajax_search_options.search_box_id%29.parents%28%27form%27%29.first%28%29%3Bif%280%3Cold_form.size%28%29%29%7Bold_form.replaceWith%28form%29%7Delse%7B%24%28%27%23left%2C%23right%2C%23alpha%3Ahas%28div.module%29%2C%23beta%3Ahas%28div.module%29%2C%23gamma%3Ahas%28div.module%29%27%29.last%28%29.prepend%28form%29%7D%24%28%27html%2Cbody%27%29.animate%28%7BscrollTop%3Aform.offset%28%29.top-32%7D%2C%27fast%27%29%3B%24%28%27%23%27%2Bcocolog_ajax_search_options.search_box_id%29.focus%28%29%7DaddSearchForm%28%29%3B%24.getScript%28%27https%3A%2F%2Ffuryutei.work%2Fscript%2Fjq-highlight.js%27%2C%28function%28%29%7B%24.getScript%28%27https%3A%2F%2Ffuryutei.work%2Fscript%2Fjq-cocolog_ajax_search.js%27%2C%28function%28%29%7B%7D%29%29%7D%29%29%7Dvar%20script%3Ddocument.createElement%28%27script%27%29%3Bscript.src%3D%27%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.11.3%2Fjquery.min.js%27%3Bdocument.documentElement.appendChild%28script%29%3Bcheck%28%29%7D%29%28%29%3B"&gt;「ココログ用検索」の検索ボックスを任意のココログに&lt;/a&gt;&lt;pre&gt;/*
 * @title 「ココログ用検索」の検索ボックスを任意のココログに
 * @description http://java.cocolog-nifty.com/blog/2005/10/javascript_c163.html の移植版(jQuery使用)
 * @include *
 * @javascript_url
 * @license MIT License
 */

(function(){
'use strict';

window.cocolog_ajax_search_options = {
    color : '#ffcc33'
,   truncation_length : 80
,   entry_per_page : 20
,   max_concurrent_load : 10
,   display_search_form : true
,   look_ahead : false
,   search_box_id : 'search_box'
,   search_credit_id : 'search_credit'
,   debug : true
};

function check() {
    var $ = window.jQuery;
    if (!$) {
        setTimeout(check, 100);
        return;
    }
    function addSearchForm() {
        var form = $([
                '&amp;lt;form onsubmit=&amp;quot;cocologAjaxSearch( null, jQuery(\'#' + cocolog_ajax_search_options.search_box_id + '\').val() ); return false&amp;quot;&amp;gt;'
            ,   '    &amp;lt;input type=&amp;quot;search&amp;quot; id=&amp;quot;' + cocolog_ajax_search_options.search_box_id + '&amp;quot; name=&amp;quot;search_box&amp;quot; value=&amp;quot;&amp;quot;  results=&amp;quot;5&amp;quot; autosave=&amp;quot;tangerine&amp;quot; placeholder=&amp;quot;検索語を入力&amp;quot; /&amp;gt;'
            ,   '    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;検索&amp;quot; /&amp;gt;'
            ,   '    &amp;lt;span id=&amp;quot;search_credit&amp;quot; style=&amp;quot;font-size: xx-small; margin-left: 4px;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;'
            ,   '&amp;lt;/form&amp;gt;'
            ].join('\n')),
            old_form = $( '#' + cocolog_ajax_search_options.search_box_id ).parents('form').first();
        
        if ( 0 &amp;lt; old_form.size() ) {
            old_form.replaceWith(form);
        }
        else {
            $('#left,#right,#alpha:has(div.module),#beta:has(div.module),#gamma:has(div.module)').last().prepend(form);
        }
        $('html,body').animate({scrollTop: form.offset().top - 32}, 'fast');
        $( '#' + cocolog_ajax_search_options.search_box_id ).focus();
    }
    addSearchForm();
    
    $.getScript('https://furyutei.work/script/jq-highlight.js', function() {
        $.getScript('https://furyutei.work/script/jq-cocolog_ajax_search.js', function() {
        });
    });
}
var script = document.createElement('script');
script.src = '//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js';
document.documentElement.appendChild(script);
check();
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/ir-Nt4nwgaAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/ir-Nt4nwgaAA</link>
    <dc:date>2020-09-17T23:45:35Z</dc:date>
    <description>今後は https://greasyfork.org/ja/scripts/411491-yn-searchorigin 参照（Yahoo!ニュースでは元記事へのリンクがないので、元記事を探すのを補助するブックマークレットを作ってみた）</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] Yahoo!ニュースの元記事を探す</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20yahoo_news_hostname%3Dnew%20URL%28location.href%29.hostname%2Ccwin%3Dwindow.open%28%27about%3Ablank%27%29%2Cclose_cwin%3D%28%29%3D%3Ecwin.close%28%29%2Cgoto_page%3Durl%3D%3Ecwin.location.href%3Durl%2Cgoto_search_page%3Dsearch_info%3D%3Egoto_page%28%27https%3A%2F%2Fwww.google.com%2Fsearch%3Fie%3DUTF-8%26q%3D%27%2BencodeURIComponent%28%27site%3A%27%2Bsearch_info.hostname%2B%27%20%27%2Bsearch_info.keyword%29%29%2Cget_search_info%3Ddoc%3D%3E%7Bif%28%21doc%29doc%3Ddocument%3Bconst%20site_url%3D%28doc.querySelector%28%27a%5Bdata-ylk%3D%22rsec%3Adetail%3Bslk%3Abanner%3B%22%5D%27%29%7C%7C%7B%7D%29.href%3Bif%28%21site_url%29return%20null%3Breturn%7Bhostname%3Anew%20URL%28site_url%29.hostname%2Ckeyword%3A%28%28doc.querySelector%28%27meta%5Bproperty%3D%22og%3Atitle%22%5D%27%29%7C%7C%7B%7D%29.content%7C%7Cdoc.title%29.replace%28%2F%5Cs%2A-%5B%5E%5C-%5D%2A%24%2F%2C%27%27%29%7D%7D%2Csearch_info%3Dget_search_info%28%29%3Bif%28search_info%21%3D%3Dnull%29%7Bgoto_search_page%28search_info%29%3Breturn%7Dconst%20readmore_url%3D%28document.querySelector%28%27%5Bdata-ylk%5E%3D%22rsec%3Atpc_main%3Bslk%3Aheadline%3Bpos%3A%22%5D%27%29%7C%7C%7B%7D%29.href%3Bif%28%21readmore_url%29%7Bclose_cwin%28%29%3Breturn%7Dgoto_page%28readmore_url%29%3Bnew%20Promise%28%28resolve%3D%3E%7Bconst%20check%3D%28%29%3D%3E%7Btry%7Bif%28new%20URL%28cwin.location.href%29.hostname%3D%3Dyahoo_news_hostname%29%7Bresolve%28%29%3Breturn%7D%7Dcatch%28error%29%7B%7DsetTimeout%28check%2C100%29%7D%3Bcheck%28%29%7D%29%29.then%28%28%28%29%3D%3E%7Bconst%20cdoc%3Dcwin.document%2Cdo_search%3D%28%29%3D%3E%7Bconst%20search_info%3Dget_search_info%28cdoc%29%3Bif%28search_info%21%3D%3Dnull%29%7Bgoto_search_page%28search_info%29%3Breturn%7Dclose_cwin%28%29%7D%3Bif%28cdoc.readyState%3D%3D%3D%27loading%27%29%7Bcdoc.addEventListener%28%27DOMContentLoaded%27%2Cdo_search%29%3Breturn%7Ddo_search%28%29%7D%29%29%7D%29%28%29%3B"&gt;Yahoo!ニュースの元記事を探す&lt;/a&gt;&lt;pre&gt;/*
 * @title Yahoo!ニュースの元記事を探す
 * @description 今後は https://greasyfork.org/ja/scripts/411491-yn-searchorigin 参照（Yahoo!ニュースでは元記事へのリンクがないので、元記事を探すのを補助するブックマークレットを作ってみた）
 * @include https://news.yahoo.co.jp/articles/*
 * @include https://news.yahoo.co.jp/pickup/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

( () =&amp;gt; {
'use strict';
const
    yahoo_news_hostname = new URL( location.href ).hostname,
    cwin = window.open( 'about:blank' ),
    close_cwin = () =&amp;gt; cwin.close(),
    goto_page = ( url ) =&amp;gt; cwin.location.href = url,
    goto_search_page = ( search_info ) =&amp;gt; goto_page( 'https://www.google.com/search?ie=UTF-8&amp;amp;q=' + encodeURIComponent( 'site:' + search_info.hostname + ' ' + search_info.keyword ) ),
    get_search_info = ( doc ) =&amp;gt; {
        if ( ! doc ) doc = document;
        
        const
            site_url = ( doc.querySelector('a[data-ylk=&amp;quot;rsec:detail;slk:banner;&amp;quot;]') || {} ).href;
        
        if ( ! site_url ) return null;
        
        return {
            hostname : new URL( site_url ).hostname,
            keyword : ( ( doc.querySelector( 'meta[property=&amp;quot;og:title&amp;quot;]' ) || {} ).content || doc.title ).replace( /\s*-[^\-]*$/, '' ),
        };
    },
    search_info = get_search_info();

if ( search_info !== null ) {
    goto_search_page( search_info );
    return;
}

const
    readmore_url = ( document.querySelector( '[data-ylk^=&amp;quot;rsec:tpc_main;slk:headline;pos:&amp;quot;]' ) || {} ).href;

if ( ! readmore_url ) {
    close_cwin();
    return;
}

goto_page( readmore_url );

new Promise( resolve =&amp;gt; {
    const
        check = () =&amp;gt; {
            try {
                if ( new URL( cwin.location.href ).hostname == yahoo_news_hostname ) {
                    resolve();
                    return;
                }
            }
            catch ( error ) {
            }
            setTimeout( check, 100 );
        };
    
    check();
} )
.then( () =&amp;gt; {
    const
        cdoc = cwin.document,
        do_search = () =&amp;gt; {
            const
                search_info = get_search_info( cdoc );
            
            if ( search_info !== null ) {
                goto_search_page( search_info );
                return;
            }
            close_cwin();
        };
    
    if ( cdoc.readyState === 'loading' ) {
        cdoc.addEventListener( 'DOMContentLoaded', do_search );
        return;
    }
    do_search();
} );

} )();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/irvx8sf4gaAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/irvx8sf4gaAA</link>
    <dc:date>2020-09-12T10:44:35Z</dc:date>
    <description>Twitterで引用ツイートを嫌がる方のツイートを引用したい場合に使ってみる？</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] 通知の行かない なんちゃって引用ツイート</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20width%3D1024%2Cheight%3D768%3Blet%20matches%3Dnew%20URL%28location.href%29.pathname.match%28%2F%5E%5C%2F%28%5B%5E%2F%5D%2B%29%5C%2Fstatus%5C%2F%28%5Cd%2B%29%2F%29%3Bif%28%21matches%29return%3Blet%20screen_name%3Dmatches%5B1%5D%2Cid_str%3Dmatches%5B2%5D%2Cid%3DBigInt%28id_str%29%2Cquery%3D%27from%3A%27%2Bscreen_name%2B%27%20since_id%3A%27%2B%28id-1n%29%2B%27%20max_id%3A%27%2Bid%2Curl%3D%27https%3A%2F%2Ftwitter.com%2Fsearch%3Ff%3Dlive%26q%3D%27%2BencodeURIComponent%28query%29%3Bwindow.open%28%27https%3A%2F%2Ftwitter.com%2Fintent%2Ftweet%3Furl%3D%27%2BencodeURIComponent%28url%29%2C%27_blank%27%2C%5B%27width%3D%27%2Bwidth%2C%27height%3D%27%2Bheight%2C%27left%3D%27%2B%28window.innerWidth-width%29%2F2%2C%27top%3D%27%2B%28window.innerHeight-height%29%2F2%2C%27scrollbars%3Dyes%27%2C%27resizable%3Dyes%27%2C%27toolbar%3Dno%27%2C%27location%3Dyes%27%5D.join%28%27%2C%27%29%29%7D%29%28%29%3B"&gt;通知の行かない なんちゃって引用ツイート&lt;/a&gt;&lt;pre&gt;/*
 * @title 通知の行かない なんちゃって引用ツイート
 * @description Twitterで引用ツイートを嫌がる方のツイートを引用したい場合に使ってみる？
 * @include https://twitter.com/*
 * @include https://mobile.twitter.com/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

( () =&amp;gt; {
const
    width = 1024,
    height = 768;

let matches = new URL( location.href ).pathname.match( /^\/([^/]+)\/status\/(\d+)/ );
if ( ! matches ) return;

let screen_name = matches[ 1 ],
    id_str = matches[ 2 ],
    id = BigInt( id_str ),
    query = 'from:' + screen_name + ' since_id:' + (id - 1n ) + ' max_id:' + id,
    url = 'https://twitter.com/search?f=live&amp;amp;q=' + encodeURIComponent( query );

window.open( 'https://twitter.com/intent/tweet?url=' + encodeURIComponent( url ),
    '_blank',
    [
        'width=' + width,
        'height=' + height,
        'left=' + ( window.innerWidth - width ) / 2,
        'top=' + ( window.innerHeight - height ) / 2,
        'scrollbars=yes',
        'resizable=yes',
        'toolbar=no',
        'location=yes',
    ].join( ',' )
);
} )();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/g5G0rbat-JM4">
    <link>https://let.hatelabo.jp/furyu-tei/let/g5G0rbat-JM4</link>
    <dc:date>2020-04-14T13:45:26Z</dc:date>
    <description>今後は https://greasyfork.org/ja/scripts/400695-i-like-latest-tweets 参照（Twitter のタイムラインが「ホーム」になったときに、最新ツイート表示に切り替える）</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] 最新ツイート表示が好き！</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Blet%20status%3D%27idle%27%3Bconst%20FixToLatestTweetTimeline%3Dnew%20class%7Bconstructor%28%29%7Bthis.status%3D%27idle%27%3Bthis.update_status%28%29%7Dupdate_status%28%29%7Bswitch%28this.status%29%7Bcase%27idle%27%3A%7Blet%20home_mode_button%3Dthis.get_home_mode_button%28%29%3Bif%28%21home_mode_button%29%7Bbreak%7Dconsole.log%28%27%E3%80%8C%E3%83%9B%E3%83%BC%E3%83%A0%E3%80%8D%E3%82%92%E6%A4%9C%E7%9F%A5%EF%BC%81%E6%9C%80%E6%96%B0%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88%E8%A1%A8%E7%A4%BA%E3%81%B8%E5%88%87%E3%82%8A%E5%A4%89%E3%81%88%E3%81%BE%E3%81%99%EF%BC%81%27%29%3Bhome_mode_button.click%28%29%3Bthis.status%3D%27wait_menu%27%3Bbreak%7Dcase%27wait_menu%27%3A%7Blet%20change_to_recent_mode_button%3Dthis.get_change_to_recent_mode_button%28%29%3Bif%28%21change_to_recent_mode_button%29%7Bbreak%7Dchange_to_recent_mode_button.click%28%29%3Bconsole.log%28%27%E6%9C%80%E6%96%B0%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88%E8%A1%A8%E7%A4%BA%E3%81%B8%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E4%B8%AD%E2%80%A6%27%29%3Bthis.status%3D%27wait_home_mode_button_off%27%3Bbreak%7Dcase%27wait_home_mode_button_off%27%3A%7Blet%20home_mode_button%3Dthis.get_home_mode_button%28%29%3Bif%28home_mode_button%29%7Bbreak%7Dconsole.log%28%27%E6%9C%80%E6%96%B0%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88%E8%A1%A8%E7%A4%BA%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%82%8F%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81%27%29%3Bthis.status%3D%27idle%27%3Bbreak%7D%7D%7Dget_home_mode_button%28%29%7Breturn%20document.querySelector%28%27div%5Brole%3D%22button%22%5D%5Baria-label%3D%22%E3%83%88%E3%83%83%E3%83%97%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88%E3%81%8C%E3%82%AA%E3%83%B3%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%22%5D%27%29%7Dget_change_to_recent_mode_button%28%29%7Breturn%20Array.from%28document.querySelectorAll%28%27div%5Brole%3D%22menu%22%5D%20div%5Brole%3D%22menuitem%22%5D%20%3E%20div%20%3E%20div%20%3E%20span%27%29%29.filter%28%28span%3D%3E0%3C%3Dspan.textContent.indexOf%28%27%E6%9C%80%E6%96%B0%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88%E8%A1%A8%E7%A4%BA%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%27%29%29%29%5B0%5D%7D%7D%2Cobserver%3Dnew%20MutationObserver%28%28records%3D%3E%7Bif%28new%20URL%28location.href%29.pathname%21%3D%27%2Fhome%27%29%7Breturn%7DFixToLatestTweetTimeline.update_status%28%29%7D%29%29%3Bobserver.observe%28document.body%2C%7BchildList%3Atrue%2Csubtree%3Atrue%7D%29%7D%29%28%29%3B"&gt;最新ツイート表示が好き！&lt;/a&gt;&lt;pre&gt;/*
 * @title 最新ツイート表示が好き！
 * @description 今後は https://greasyfork.org/ja/scripts/400695-i-like-latest-tweets 参照（Twitter のタイムラインが「ホーム」になったときに、最新ツイート表示に切り替える）
 * @include https://twitter.com/*
 * @include https://mobile.twitter.com/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

( () =&amp;gt; {
let
    status = 'idle';

const
    FixToLatestTweetTimeline = new class {
        constructor() {
            this.status = 'idle';
            this.update_status();
        }
        
        update_status() {
            switch ( this.status ) {
                case 'idle' : {
                    let home_mode_button = this.get_home_mode_button();
                    
                    if ( ! home_mode_button ) {
                        break;
                    }
                    
                    console.log( '「ホーム」を検知！最新ツイート表示へ切り変えます！' );
                    
                    home_mode_button.click();
                    
                    this.status = 'wait_menu';
                    break;
                }
                case 'wait_menu': {
                    let change_to_recent_mode_button = this.get_change_to_recent_mode_button();
                    
                    if ( ! change_to_recent_mode_button ) {
                        break;
                    }
                    
                    change_to_recent_mode_button.click();
                    
                    console.log( '最新ツイート表示へ切り替え中…' );
                    
                    this.status = 'wait_home_mode_button_off';
                    break;
                }
                
                case 'wait_home_mode_button_off' : {
                    let home_mode_button = this.get_home_mode_button();
                    
                    if ( home_mode_button ) {
                        break;
                    }
                    
                    console.log( '最新ツイート表示に切り替わりました！' );
                    this.status = 'idle';
                    break;
                }
            }
        }
        
        get_home_mode_button() {
            return document.querySelector( 'div[role=&amp;quot;button&amp;quot;][aria-label=&amp;quot;トップツイートがオンになります&amp;quot;]' );
        }
        
        get_change_to_recent_mode_button() {
            return Array.from( document.querySelectorAll( 'div[role=&amp;quot;menu&amp;quot;] div[role=&amp;quot;menuitem&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; span' ) ).filter( span =&amp;gt; 0 &amp;lt;= span.textContent.indexOf( '最新ツイート表示に切り替える' ) )[ 0 ];
        }
    },
    
    observer = new MutationObserver( ( records ) =&amp;gt; {
        if ( new URL( location.href ).pathname != '/home' ) {
            return;
        }
        FixToLatestTweetTimeline.update_status();
    } );

observer.observe( document.body, { childList: true, subtree: true } );

} )();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/g5G0rNui1MJh">
    <link>https://let.hatelabo.jp/furyu-tei/let/g5G0rNui1MJh</link>
    <dc:date>2020-04-14T13:44:50Z</dc:date>
    <description>今後は https://greasyfork.org/ja/scripts/400666-alphakaikin 参照（アルファポリス小説本文の範囲選択やコンテキストメニュー表示等を可能に）</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] α解禁</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20remove_copyguard%3D%28%29%3D%3E%7B%24%28window%29.on%28%27focusout%27%2C%28event%3D%3Eevent.stopImmediatePropagation%28%29%29%29%3Blet%20handlers%3D%24._data%28window%29.events.focusout%3Bhandlers.unshift%28handlers.pop%28%29%29%3B%24%28%27%23novelBoby%27%29.css%28%27user-select%27%2C%27%27%29%3Bdelete%20document.oncopy%3Bdelete%20document.onselectstart%3Bdelete%20document.oncontextmenu%3Bdocument.addEventListener%28%27copy%27%2C%28event%3D%3Eevent.stopPropagation%28%29%29%2Ctrue%29%3Bdocument.addEventListener%28%27selectstart%27%2C%28event%3D%3Eevent.stopPropagation%28%29%29%2Ctrue%29%3Bdocument.addEventListener%28%27contextmenu%27%2C%28event%3D%3Eevent.stopPropagation%28%29%29%2Ctrue%29%7D%2Cscript%3Ddocument.createElement%28%27script%27%29%3Bscript.async%3Dfalse%3Bscript.textContent%3D%27%28%27%2Bremove_copyguard.toString%28%29%2B%27%29%28%29%3B%27%3Bdocument.documentElement.appendChild%28script%29%7D%29%28%29%3B"&gt;α解禁&lt;/a&gt;&lt;pre&gt;/*
 * @title α解禁
 * @description 今後は https://greasyfork.org/ja/scripts/400666-alphakaikin 参照（アルファポリス小説本文の範囲選択やコンテキストメニュー表示等を可能に）
 * @include https://www.alphapolis.co.jp/novel/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

( () =&amp;gt; {
const
    remove_copyguard = () =&amp;gt; {
        $( window ).on( 'focusout', ( event ) =&amp;gt; event.stopImmediatePropagation() );
        let handlers = $._data( window ).events.focusout;
        handlers.unshift( handlers.pop() );
        $( '#novelBoby' ).css( 'user-select', '' );
        delete document.oncopy;
        delete document.onselectstart;
        delete document.oncontextmenu;
        document.addEventListener( 'copy', ( event ) =&amp;gt; event.stopPropagation(), true );
        document.addEventListener( 'selectstart', ( event ) =&amp;gt; event.stopPropagation(), true );
        document.addEventListener( 'contextmenu', ( event ) =&amp;gt; event.stopPropagation(), true );
    },
    script = document.createElement( 'script' );

script.async = false;
script.textContent = '(' + remove_copyguard.toString() +')();';
document.documentElement.appendChild( script );
} )();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/g5G0qsXXn_V4">
    <link>https://let.hatelabo.jp/furyu-tei/let/g5G0qsXXn_V4</link>
    <dc:date>2020-04-14T13:44:20Z</dc:date>
    <description>今後は https://greasyfork.org/ja/scripts/400664-letmeusef12 参照（[F12]ほか制限されている幾つかのキー操作を可能に）</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] F12は使わせて!!</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20allowd_keycode_map%3D%7B116%3A%7Bcombinations%3A%5B%5D%7D%2C122%3A%7Bcombinations%3A%5B%5D%7D%2C123%3A%7Bcombinations%3A%5B%5D%7D%2C68%3A%7Bcombinations%3A%5B%27altKey%27%5D%7D%2C69%3A%7Bcombinations%3A%5B%27ctrlKey%27%5D%7D%2C73%3A%7Bcombinations%3A%5B%5B%27ctrlKey%27%2C%27shiftKey%27%5D%5D%7D%2C76%3A%7Bcombinations%3A%5B%27ctrlKey%27%2C%27metaKey%27%5D%7D%7D%2Con_key_event%3Devent%3D%3E%7Bif%28event.isComposing%7C%7Cevent.keyCode%3D%3D229%29%7Breturn%7Dlet%20allowd_key_info%3Dallowd_keycode_map%5Bevent.keyCode%5D%3Bif%28%21allowd_key_info%29%7Breturn%7Dlet%20combinations%3Dallowd_key_info.combinations%7C%7C%5B%5D%3Bif%280%3Ccombinations.length%29%7Blet%20match_number%3Dcombinations.filter%28%28key_names%3D%3E%7Bif%28typeof%20key_names%3D%3D%27string%27%29%7Bkey_names%3D%5Bkey_names%5D%7Dreturn%20key_names.length%3D%3Dkey_names.filter%28%28key_name%3D%3Eevent%5Bkey_name%5D%29%29.length%7D%29%29.length%3Bif%28match_number%3C1%29%7Breturn%7D%7Devent.stopPropagation%28%29%7D%3Bdocument.addEventListener%28%27keydown%27%2Con_key_event%2Ctrue%29%3Bdocument.addEventListener%28%27keyup%27%2Con_key_event%2Ctrue%29%7D%29%28%29%3B"&gt;F12は使わせて!!&lt;/a&gt;&lt;pre&gt;/*
 * @title F12は使わせて!!
 * @description 今後は https://greasyfork.org/ja/scripts/400664-letmeusef12 参照（[F12]ほか制限されている幾つかのキー操作を可能に）
 * @include http://*.tameshiyo.me/*
 * @include https://*.tameshiyo.me/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

( () =&amp;gt; {
const
    allowd_keycode_map = {
        116 : { // F5
            combinations : [],
        },
        122 : { // F11
            combinations : [],
        },
        123 : { // F12
            combinations : [],
        },
        68 : { // D
            combinations : [ 'altKey', ],
        },
        69 : { // E
            combinations : [ 'ctrlKey', ],
        },
        73 : { // I
            combinations : [ [ 'ctrlKey', 'shiftKey' ], ],
        },
        76 : { // L
            combinations : [ 'ctrlKey', 'metaKey', ],
        },
    },
    
    on_key_event = ( event ) =&amp;gt; {
        if ( ( event.isComposing ) || ( event.keyCode == 229 ) ) {
            // IME入力中は無視
            return;
        }
        
        let allowd_key_info = allowd_keycode_map[ event.keyCode ];
        
        if ( ! allowd_key_info ) {
            return;
        }
        
        let combinations = allowd_key_info.combinations || [];
        
        if ( 0 &amp;lt; combinations.length ) {
            let match_number = combinations.filter( key_names =&amp;gt; {
                    if ( typeof key_names == 'string' ) {
                        key_names = [ key_names ];
                    }
                    
                    return key_names.length == key_names.filter( key_name =&amp;gt; event[ key_name ] ).length;
                } ).length;
            
            if ( match_number &amp;lt; 1 ) {
                return;
            }
        }
        event.stopPropagation();
    };
    
document.addEventListener( 'keydown', on_key_event, true );
document.addEventListener( 'keyup', on_key_event, true );

} )();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/g5G0q-6rlLJs">
    <link>https://let.hatelabo.jp/furyu-tei/let/g5G0q-6rlLJs</link>
    <dc:date>2020-04-14T13:43:50Z</dc:date>
    <description>今後は https://greasyfork.org/ja/scripts/400661-reloadsuppression-tameshiyo-me 参照（楽園WEB増刊等での予期せぬリロードを抑制）</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] リロードちょい待ち！(tameshiyo.me)</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bconst%20patch_func%3D%28%29%3D%3E%7Bconst%20setTimeoutOrig%3Dwindow.setTimeout%3Bwindow.setTimeout%3Dfunction%28func%2Cdelay%29%7Bif%28delay%3C1e3%26%260%3C%3Dfunc.toString%28%29.indexOf%28%27%22pjax%3Atimeout%22%27%29%29%7Bdelay%3D3e4%7DsetTimeoutOrig.call%28this%2Cfunc%2Cdelay%29%7D%7D%2Cscript%3Ddocument.createElement%28%27script%27%29%3Bscript.async%3Dfalse%3Bscript.textContent%3D%27%28%27%2Bpatch_func.toString%28%29%2B%27%29%28%29%3B%27%3Bdocument.documentElement.appendChild%28script%29%7D%29%28%29%3B"&gt;リロードちょい待ち！(tameshiyo.me)&lt;/a&gt;&lt;pre&gt;/*
 * @title リロードちょい待ち！(tameshiyo.me)
 * @description 今後は https://greasyfork.org/ja/scripts/400661-reloadsuppression-tameshiyo-me 参照（楽園WEB増刊等での予期せぬリロードを抑制）
 * @include http://*.tameshiyo.me/*
 * @include https://*.tameshiyo.me/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

( () =&amp;gt; {
const
    patch_func = () =&amp;gt; {
        const
            setTimeoutOrig = window.setTimeout;
        
        window.setTimeout = function ( func, delay ) {
            if ( ( delay &amp;lt; 1000 ) &amp;amp;&amp;amp; ( 0 &amp;lt;= func.toString().indexOf( '&amp;quot;pjax:timeout&amp;quot;' ) ) ) {
                // function(){l(&amp;quot;pjax:timeout&amp;quot;,[t,e])&amp;amp;&amp;amp;t.abort(&amp;quot;timeout&amp;quot;)}
                delay = 30000; // 650ms待ち(2020/04/09現在)→30秒待ち
            }
            setTimeoutOrig.call( this, func, delay );
        }
    },
    script = document.createElement( 'script' );

script.async = false;
script.textContent = '(' + patch_func.toString() +')();';
document.documentElement.appendChild( script );
} )();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/g5G0lpjGgPg9">
    <link>https://let.hatelabo.jp/furyu-tei/let/g5G0lpjGgPg9</link>
    <dc:date>2020-04-14T13:43:14Z</dc:date>
    <description>今後は https://greasyfork.org/ja/scripts/398038-kindle-unlimited-filter を参照 （Amazon Kindle検索時にKindle Unlimitedの「□ 読み放題対象タイトル」が出ないケースでもフィルタできるようにする）</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] Kindle Unlimited フィルタ</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Blet%20unlimited_checkbox%3Ddocument.querySelector%28%27input%5Bname%3D%22s-ref-checkbox-3169286051%22%5D%27%29%3Bif%28unlimited_checkbox%26%26%21unlimited_checkbox.checked%29%7Bunlimited_checkbox.click%28%29%3Breturn%7Dlet%20unlimited_item%3Ddocument.querySelector%28%27%5Bid%3D%22p_n_feature_nineteen_browse-bin%2F3169286051%22%5D%27%29%3Bif%28unlimited_item%29%7Bunlimited_checkbox%3Dunlimited_item.querySelector%28%27input%5Btype%3D%22checkbox%22%5D%27%29%3Bif%28unlimited_checkbox.checked%29%7Breturn%7Dlet%20unlimited_link%3Dunlimited_item.querySelector%28%27a%5Bdata-routing%5D%27%29%3Bif%28unlimited_link%29%7Blocation.href%3Dunlimited_link.href%3Breturn%7D%7Dlet%20category_link%3Ddocument.querySelector%28%27%5Bcel_widget_id%3D%22RESULT_INFO_BAR-RESULT_INFO_BAR%22%5D%20a%5Bdata-routing%5D%27%29%3Bif%28%21%28category_link%26%26%2F%5B%3F%26%5Di%3Ddigital-text%28%3F%3A%26%7C%24%29%2F.test%28category_link.href%29%29%29%7Breturn%7Dlet%20query_map%3D%5B...new%20URL%28location.href%29.searchParams.entries%28%29%5D.reduce%28%28%28acc%2Ccur%29%3D%3E%28%7B...acc%2C%5Bcur%5B0%5D%5D%3Acur%5B1%5D%7D%29%29%2C%7B%7D%29%3Bconst%20rh_unlimited%3D%27p_n_feature_nineteen_browse-bin%3A3169286051%27%3Blet%20rh_list%3D%27rh%27in%20query_map%3Fquery_map.rh.split%28%27%2C%27%29%3A%5B%5D%3Bif%28rh_list.includes%28rh_unlimited%29%29%7Breturn%7Drh_list.push%28rh_unlimited%29%3Bquery_map.rh%3Drh_list.join%28%27%2C%27%29%3Blet%20unlimited_url%3Dlocation.href.replace%28%2F%5C%3F.%2A%24%2F%2C%27%27%29%2B%27%3F%27%2BObject.entries%28query_map%29.map%28%28q%3D%3Eq%5B0%5D%2B%27%3D%27%2BencodeURIComponent%28q%5B1%5D%29%29%29.join%28%27%26%27%29%3Blocation.href%3Dunlimited_url%7D%29%28%29%3B"&gt;Kindle Unlimited フィルタ&lt;/a&gt;&lt;pre&gt;/*
 * @title Kindle Unlimited フィルタ
 * @description 今後は https://greasyfork.org/ja/scripts/398038-kindle-unlimited-filter を参照 （Amazon Kindle検索時にKindle Unlimitedの「□ 読み放題対象タイトル」が出ないケースでもフィルタできるようにする）
 * @include https://www.amazon.co.jp/*
 * @license MIT License
 * @javascript_url
 */

( () =&amp;gt; {
let unlimited_checkbox = document.querySelector( 'input[name=&amp;quot;s-ref-checkbox-3169286051&amp;quot;]' );
// [Kindle本トップページ](https://www.amazon.co.jp/gp/browse.html?node=2275256051)等に存在するチェックボックス

if ( unlimited_checkbox &amp;amp;&amp;amp; ( ! unlimited_checkbox.checked ) ) {
    unlimited_checkbox.click();
    return;
}

let unlimited_item = document.querySelector( '[id=&amp;quot;p_n_feature_nineteen_browse-bin/3169286051&amp;quot;]' );

if ( unlimited_item ) {
    unlimited_checkbox = unlimited_item.querySelector( 'input[type=&amp;quot;checkbox&amp;quot;]' );
    
    if ( unlimited_checkbox.checked ) {
        return;
    }
    
    let unlimited_link = unlimited_item.querySelector( 'a[data-routing]' );
    
    if ( unlimited_link ) {
        location.href = unlimited_link.href;
        return;
    }
}

let category_link = document.querySelector( '[cel_widget_id=&amp;quot;RESULT_INFO_BAR-RESULT_INFO_BAR&amp;quot;] a[data-routing]' );

if ( ! ( category_link &amp;amp;&amp;amp; /[?&amp;amp;]i=digital-text(?:&amp;amp;|$)/.test( category_link.href ) ) ) {
    // Kindleストア以外
    return;
}

let query_map = [ ... new URL( location.href ).searchParams.entries() ].reduce( ( acc, cur ) =&amp;gt; ( { ... acc, [ cur[ 0 ] ] : cur[ 1 ] } ), {} );


const
    rh_unlimited = 'p_n_feature_nineteen_browse-bin:3169286051';

let rh_list = ( 'rh' in query_map ) ? query_map.rh.split( ',' ) : [];

if ( rh_list.includes( rh_unlimited ) ) {
    return;
}

rh_list.push( rh_unlimited );

query_map.rh = rh_list.join( ',' );

let unlimited_url = location.href.replace( /\?.*$/, '' ) + '?' + Object.entries( query_map ).map( q =&amp;gt; q[ 0 ] + '=' + encodeURIComponent( q[ 1 ] ) ).join( '&amp;amp;' );

location.href = unlimited_url;

} )();
&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
