Uassets: Facebook

Created on 30 Aug 2018  ·  384Comments  ·  Source: uBlockOrigin/uAssets

URL(s) where the issue occurs

Facebook.com

Describe the issue

The Facebook sponsored ads is appearing again, i have tried all the solutions but nothing works

Versions

  • Browser/version: [Chrome 68.0.3440.106]
  • uBlock Origin version: [1.16.18]

Settings

  • [Default]

Most helpful comment

Current working (for me):

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span[data-ft="{\"tn\":\"j\"}"])
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Create ad))

All 384 comments

I see nothing Can it be adware?
you have to see what programs you installed any
check if you do not have some rare extensions

No i don't have any adware or some adware extensions, the ads are from Facebook ( sponsored )

While on a page with ads, right click on page, save as ..., you'll get a folder + html page, zip them together, upload the zip on some free server. Post here the link.

Here the page with the sponsored ad: https://ufile.io/y827j

@GetGankNow test this filter
facebook.com##.userContentWrapper :has([id^="feed_subtitle_"]:has-text(Sp))

@mapx- is blocking all post but allowing the comment section and reaction section.

facebook.com###substream_1:has([id^="feed_subtitle_"]:has-text(Sp))

@mapx- works bro, thanks a lot.

Edit: some sponsored ads are appearing again.

another example page ?

The page that i save include all ads, i don't know how to save the page without the ads of this: facebook.com###substream_1:has([id^="feed_subtitle_"]:has-text(Sp))

facebook.zip
Here the page again.

test

facebook.com##[id^=hyperfeed_story_id_]:has(a[href*="client_token"])
facebook.com##[id^=hyperfeed_story_id_]:has(a[href*="utm_campaign"])

@mapx- this 3 rules works. Thanks for all!!

ads 'sponsored'

screenshot 41c

test
facebook.com##[id^=hyperfeed_story_id_]:has([id^=u_fetchstream_2_1]:has-text(SpSonSsoSredS))
or
facebook.com##[id^=hyperfeed_story_id_]:has([id^=u_fetchstream_2_1]:has-text(Sp))

not working bro
screenshot 42

weird, working for me (exactly using your test-case)

Did you test the same case you uploaded ? or something new ? could be "they" are using different approaches

Doesn't work for me either. I had to use something like this:

facebook.com##[id^=hyperfeed_story_id_]:has([id^=feed_subtitle_]:has-text(SpSonSsoSredS))

However, with this filter active, FB seems to be refreshing the posts in an infinite loop.

From about 3mo to about 2wk ago, it was possible to catch Sponsored posts with :has-text(SpSonSsoSredS). This appeared only in Sponsored posts, with the 'S' elements hidden by CSS. (I'm not sure about back then, but now, the hiding CSS uses 'font-size:0', not 'display:none'.)

About 2wk ago, they started putting that stuff into _all_(*) posts. In Sponsored posts they use CSS to hide the 'S' elements. In 'normal' posts they use CSS to hide _all_ of this. :has-text() is not aware of CSS hiding. The CSS used for this hiding is cryptographically hashed; so far it has remained stable for me, but another user has completely different classes, so the simple selector I use in my own filter won't work for anyone else. So we have to get into runtime evaluation of CSS computed styles :(

[(*)Not really 'all', but all normal posts by users, and many Sponsored posts, although some emitted by other modules inside FB don't use this particular trickery.]

It seems like uBO :matches-css() [see: https://github.com/gorhill/uBlock/wiki/Procedural-cosmetic-filters] might be able to handle this. Something like:

facebook.com##[id^=hyperfeed_story_id_]:if([id^=feed_subtitle_] span:has-text(^Sp$):matches-css(:not(display:none)))

-- which is COMPLETELY UNTESTED, just a pile of syntax smashed together by hand. Not sure if the nested uBO selectors are supported...

And all they need to do to break this is chop the word 'Sponsored' up differently; and it won't work for other UI languages. This is getting ugly.

Maybe need to view the deep of they DOM tag, e.g. looking in data-ajaxify, data-sigil, data-uri, data-ft, data-xt, ...

for example, I've found some part of sponsored URLs have is_sponsored=1 parameter, sometime it's boxed the parameter like [is_sponsored]=1

Hi, I saw the comment in filters so I'd like report here:
I am not sure if is region-related, but the following rule is killing my timeline (using https://www.facebook.com/?sk=h_chr). All of the posts are hidden now.

facebook.com##[id^=hyperfeed_story_id_]:has([id^=feed_subtitle_]:has-text(SpSonSsoSredS))

Thanks.

This issue probably should be reopened, as more ads are using this new method to show up.

That said, I've identified the filter to block this ad:

facebook.com##[id^=hyperfeed_story_id_]:has([id*=feed_subtitle_]):if(a:if(span:has-text(/^Sp$/)):matches-css(display: inline))

Same thing as about but it might be better without too much regex:

facebook.com##[id^=hyperfeed_story_id_]:has([id*=feed_subtitle_]):if(a:if(span:has-text(SpSonSsoSredS)):matches-css(display: inline))

The basic idea is that the a element is showing up as display block if it is an ad and display inline if it is not an ad. This is how we positively identify the ads.

Additionally, id changed from ^feed_subtitle_ to ^_feed_subtitle_, so I'm matching with a *=

I'm also having some publicty, but I have spanish as language so it says "Publicidad".
Example: https://i.imgur.com/InXCyaM.png

@shuhaowu try this:

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(div[id^="_feed_subtitle_"] > span:matches-css(display:none):has(abbr .timestampContent))

-- which is back to the 'hidden timestamp' trick, but using computed CSS. I think inline vs. block at the 'Sp' level is an accident, while the display:none ancestor span is 100% intentional. And blocking on hidden .timestampContent is completely UI-language-agnostic, while 'Sp' only works for English and a few other languages (e.g. would probably need to be 'Pu' for @sigtus's Spanish example above).

:has():if(span:has()) applies span:has() to all span elements inside hyperfeed_story_id; I'm trying to restrict the use of expensive JS computations to only spans inside feed_subtitle. And in fact only direct children of feed_subtitle, so this should be _many_ times more efficient. (But I don't know how to actually test uBO filter performance in a situation like this, where the materials to be filtered are controlled by a site like FB which emits different stuff on every reload...)

I do not have a Facebook account, but I think we should leave one Facebook issue open.
I doubt very much that Facebook will stop trying to push their ads, so this issue will never be "fixed".

I think inline vs. block at the 'Sp' level is an accident

It's not at the "Sp" level. The <span>s inside the <a> are definitely the same across all posts. It's the <a> which is toggled depending on if the post is something we want to block or not.

I'm also not familiar with what timestampcontent is, but it sounds like something easily fixable on the their end. Detecting texts would be much harder to deal with.

Ideally, we would be able to strip out text that doesn't display in a function similar to has-text, although I guess that would be relatively expensive. The browsers _should_ have this information already internally, as hinted by the fact that you can do things like Ctrl+F for Sponsored on the page and have it return sensible results.

I'm trying to restrict the use of expensive JS computations to only spans inside feed_subtitle

Shouldn't my filter execute only on the children of <a>s inside feed_subtitle as I've restricted it down to that? My filter is along the line of :has():if(a:if(span:has())).

The <span>s inside the <a> are definitely the same across all posts

Only when your FB UI language is English. If a workable UI-language-neutral expression can be written, that's better.

I'm also not familiar with what timestampcontent is, but it sounds like something easily fixable on the their end.

Yes of course whatever the ad blockers look for, they will further mutate. And of course it is all futile because people who are going to the trouble to block ads _don't want ads_ and will not buy products offered by those ads. Yet they persist. As must we, putting up new blocks as the old ones fail.

the fact that you can do things like Ctrl+F for Sponsored on the page and have it return sensible results

Which browser? In Opera, and I assume this would be true for the whole Chromium family, searching for 'Sponsored' does not find those posts; searching for 'SpSonSsoSredS' highlights the visible word 'Sponsored'. Perhaps you are using Firefox and it actually does do integrative visibility checking on text searches. It seems unlikely, though -- those 'S' aren't even hidden with display:none, rather font-size:0. I'm not even sure it's well-defined which of those searches should succeed. When you see 'Sponsored' on such a post, in the fully resolved browser window, the actual string being displayed is 'SpSonSsoSredS'! Except the extra 'S's have font size 0.

Shouldn't my filter execute only on the children of s inside feed_subtitle as I've restricted it down to that?

You have [id^=hyperfeed_story_id_]:has([id*=feed_subtitle_]):if(a:if(...)) -- as I understand it, this checks whether hyperfeed_story_id has feed_subtitle; then, if so, it checks the subsequent :if() against hyperfeed_story_id again. To narrow the scope of the 2nd check you would need to apply it to the search item of your :has(), changing from:

[id^=hyperfeed_story_id_]:has([id*=feed_subtitle_]):if(a:if(...)) to
[id^=hyperfeed_story_id_]:has([id*=feed_subtitle_]:if(a:if(...))) -- except that is not allowed, :has() can only search for valid expressions according to what the ongoing CSS4 working group has defined, so it would need to be:
[id^=hyperfeed_story_id_]:if([id*=feed_subtitle_]:if(a:if(...)))

Perhaps you are using Firefox and it actually does do integrative visibility checking on text searches. It seems unlikely, though

Hmm I must have done something wrong earlier, but I did just try this on FF and the text search doesn't work.

@ghajini

working for me

facebook.com###substream_1:has([id^="feed_subtitle_"]:has-text(Sp))
facebook.com##[id^=hyperfeed_story_id_]:has(a[href*="gsuitebygoogle"])

However, the second one targets directly this specific ad

I see too many ads like
Amazon sponsored , Samsung sponsored etc

Choose a part of the link to samsung, amazon and create filters like the above 1 for google suite (gsuitebygoogle)

and remember to provide feedback on the filters above

Yeah, those 2 filters hided Google suite ad only, not others as I said previously

ok, follow my advice with the other ads and if works post here your filters

@mapx-

facebook.com###substream_1:has([id^="feed_subtitle_"]:has-text(Sp))

#substream_1 doesn't exist in FB pages I see; and this is a good thing, because :has([id^="feed_subtitle_"]:has-text(Sp)) would remove almost all posts. And it would remove at the anchor point #substream_1, so if that did exist I guess it would remove 100% of all posts, tearing them out at the root of the entire post stream.

@filbo I tested with the page @ghajini uploaded and ... it worked for me.
However I guess blocking single advertisers is the last way for the moment

This is a tested and working expression, with minor performance impact:

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(div[id^="_feed_subtitle_"] > span:matches-css(display:none):has(abbr .timestampContent))

Let's see what @okiehsch is thinking ( this issue will never be "fixed" )

I only meant to say that we should keep the issue open, you can obviously still add filters, I can‘t test I have no account.

Don't know these also works...

facebook.com##div[id^="hyperfeed_story_id"]:has(a[href*="[is_sponsored]=1"])
facebook.com##div[id^="hyperfeed_story_id"]:has(a[href*="is_sponsored=1"])

or

facebook.com##div[id^="hyperfeed_story_id"]:has(a[data-uri*="[is_sponsored]=1"])
facebook.com##div[id^="hyperfeed_story_id"]:has(a[data-uri*="is_sponsored=1"])

@mapx-

filbo I tested with the page @ghajini uploaded and ... it worked for me.

@ghajini posted two expressions. The first:

facebook.com###substream_1:has([id^="feed_subtitle_"]:has-text(Sp))

won't work, and would be harmful if it did. Fortunately it won't do anything.

The second:

facebook.com##[id^=hyperfeed_story_id_]:has(a[href*="gsuitebygoogle"])

is legit, but site-specific. (And would catch users talking about that site, if they included a live link to it, but that's a small danger.)

However I guess blocking single advertisers is the last way for the moment

It isn't. The expression I posted works on 80-90% of current FB ads by detecting the CSS trickery they're using to hide the timestamp on 'Sponsored' posts. The remainder are caught by filtering for a._5pcq[ajaxify*='ad_id='] within a post, probably facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:has(a._5pcq[ajaxify*='ad_id=']) in an uBO context.

a[href*="is_sponsored=1"] might catch a couple percent, but they would already be caught by the timestamp filter. Until FB breaks that in some new way, of course.

I wrote:

facebook.com###substream_1:has([id^="feed_subtitle_"]:has-text(Sp))

won't work, and would be harmful if it did. Fortunately it won't do anything.

Hmm, even worse. #substream_1 does exist on the main News Feed page (https://www.facebook.com/) -- but contains only 1, or possibly up to 5 posts. There is also a similar #substream_0, and then a bunch of #substream_0_5baxxxxxxxxxxxxxxxxxxxx divs each containing 5 posts. So that expression could potentially block up to 5 ads, if they happen to be pushed down in one of the two early post-streaming blocks.

#substream_1 does not exist on Timeline, Page, Group, or search-results post pages; nothing matching [id^=substream_] exists.

FB _post_ filters should be keyed with:

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(WHATEVER) (use has(WHATEVER) if WHATEVER is a standards-compliant CSS expression).

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(div[id^="_feed_subtitle_"] > span:matches-css(display:none):has(abbr .timestampContent))

I had to remove the underscore before _feed_subtitle as the IDs I see begin with just feed_subtitle:

@Robertof -- that was fixed by @mapx-, you should refresh your uBlock filters.

@mapx- -- the rules of :has() insist that both the left and right CSS must be CSS4-proposed-standards compliant. :matches-css(whatever):has(whatever) is invalid because :has() is applied to uBO pseudo-CSS.

By 'invalid' here I do not mean that it won't work. It does work _right now_. But the point of the distinction between :has() and :if() is that if uBO is someday running on a browser which natively supports :has(), it can allow that part of the CSS to be handled directly by the browser. Code which uses :if() is not expected to ever be browser-compatible and must always be interpreted by uBO.

Therefore, if this expression is still in the filter set at a time when uBO encounters a browser with native :has() support -- the expression will fail. It should be further revised to:

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(div[id*="feed_subtitle_"] > span:matches-css(display:none):if(abbr .timestampContent))

The following _MIGHT_ work (but I have not tested), and would likely be more efficient if it does:

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(div[id*="feed_subtitle_"] > span:has(abbr .timestampContent)):matches-css(display:none)

(should be more efficient because we're applying the expensive :matches-css() to fewer spans)

:if is deprecated, I (or someone) need to update wiki - https://github.com/gorhill/uBlock/issues/3683

Thanks, @gwarser. So uBO now parses all :has() and internally boils them down to whatever's necessary, including (possibly) passing through to browser's :has() if that exists and the expression is going to be compatible?

(that seems like a net improvement -- future uBO behavior doesn't depend on rule authors following obscure rules, violation of which have no _current_ negative effect... Deciding which :has() are browser-compatible only needs to be done once at the time the expression is first loaded, not each time at runtime...)

Actually @gorhill I want to know this too.

I think currently it's more like 'uBO assumes (correctly) that no browser supports :has(), so it just handles it all itself. If/when browsers support it, and it seems worthwhile, future code can munge filter-supplied :has() instances down to internal uBO representation _or_ leave simple CSS-standards-compliant :has() for the browser to interpret'

All cosmetic filters are first validated to find out whether they are valid CSS selectors. If that fails, uBO then tries to parse them as procedural cosmetic filters. Whenever a browser starts to support :has, uBO will see them as valid CSS selectors and they will be used as such (assuming the content of :has(...) also pass as a valid CSS selector). This is all done at filter list-compile time.

ads gone on those ''sponsored'' thing on my end as of now....what i see now is popular across facebook videos ....it is annoyance a/c to me......how to fix that

upload such a page like before

sir can't give that html page(right click-save as...) ,it includes personal info,photos of friends & posts in that html page .... sorry for that

Test these filters

facebook.com##.fbUserStory:has-text(Popular on Facebook)
facebook.com##.userContentWrapper:has-text(Popular on Facebook)

Replace Popular on Facebook by what exactly you get on those posts

thanks these worked
facebook.com##.fbUserStory:has-text(Popular Across Facebook)
facebook.com##.userContentWrapper:has-text(Popular Across Facebook)

moved to annoyances list

Those will catch people _talking_ about that type of annoyance post. Which they do.

Some form of ..:has(span:has-text(^Popular Across Facebook$)) is the way to go. The annoyance string will be in its own separate span and that will essentially never happen in user conversation.

I haven't seen that particular pseudo-post in months, so I can't examine or test at the moment.

The Popular Across Facebook rule doesn't work for me. I wrote this rule:
facebook.com##[id^=hyperfeed_story_id_]:has([id^=feed_subtitle_] span>div a[href="#"]:matches-css(display: inline))

@bugos that's going to match all sorts of stuff other then 'Popular Across Facebook'.

I'm seeing Facebook sponsored ads now as well.
image

Can you try the rule I posted above? For me it seems to work fine.

The Popular Across Facebook rule doesn't work for me. I wrote this rule:
facebook.com##[id^=hyperfeed_story_id_]:has([id^=feed_subtitle_] span>div a[href="#"]:matches-css(display: inline)

Doesn't work.

Looks like it's missing a closing ) at the end (or somewhere else before -- not sure about what was intended).

Added an extra ) at the end still doesn't remove the ads.

I promise you, if you get that rule to work as written, it will knock out all sorts of FB posts other than the one it supposedly targets.

Open your browser console on the FB News Feed (main page) after you've scrolled down a few dozen posts. Run this JS:

document.querySelectorAll('span>div a[href="#"]').forEach(function(dom,idx){if (window.getComputedStyle(dom)['display']=='inline')console.log(idx,dom.innerText)})

That will show you the text of the items this rule targets. I just ran it on a page with 12 posts loaded, and the output is:

4 "See More"
5 "Like"
6 "Like"
7 "Like"
8 "Like"
14 "[friend 1] and 13 others have been here"
19 "[friend 2] and 11 others have been here"
21 "Like"
22 "Like"

None of the matched posts are 'Popular Across Facebook'. The selector picks up any FB 'button' they've implemented as an a element.

It seems to work well for me and it blocks only the promotional posts:
screenshot 2018-10-22 at 02 24 28
@filbo the selector you write doesn't even contain the id^=hyperfeed_story_id_ and id^=feed_subtitle_ tags. Also it doesn't select anything in my browser so its possible that facebook is testing different version of the feed page.

Yes, that was not a uBlock complete selector to cleanly carve out whole posts, it was a probe into the works of an FB posts page.

If you are successfully blocking any posts with:

facebook.com##[id^=hyperfeed_story_id_]:has([id^=feed_subtitle_] span>div a[href="#"]:matches-css(display: inline)

then the extracted portion of it which I said to run:

span>div a[href="#"]

must by definition match at least one element on the same page.

FB uses a[href="#"] style links _all over the place_. span>div a is an overwhelmingly common construct on FB (and likely on many web pages, though perhaps some would be more careful about their element nesting approaches).

its possible that facebook is testing different version of the feed page

FB is constantly A/B testing multiple versions of every module in the web client (120+ JS files). So yeah, your layout may be different. That's still a bad filter.

I don't care if you personally use it (and likely hide posts you wouldn't want to); I just want uBO not to put it into the filters feed used by thousands of people who wouldn't know a selector if it bit them.

For the last few days, I have noticed that facebook sponsored ads have appeared again (using latest uBO).

I noticed the "sponsored" link is here but disabled for non-sponsored posts. So I wrote this filter:

facebook.com##div.userContentWrapper:if-not(span>div a[role="link"]:matches-css(display: none))

I've been testing @econtal's filter and it seems to be doing the job so far.

added

added:

facebook.com,facebookcorewwwi.onion##div.userContentWrapper:if-not(span>div a[role="link"]:matches-css(display: none))

should be anchored at [id^=hyperfeed_story_id_], else it leaves behind visual markers

guys do something,,,,its so much annoying to see these "popular across facebook" after every 3 genuine posts
filled my timeline wiith this crappy thing

I cannot reproduce the ads.
If you want to help just save on some server the saved page and send me the link to this email:
[email protected]

I recall from Tumblr issue that Firefox and Chrome script injection permissions are not exactly the same.
The ads were appearing on Firefox.

Tested right now in FF too => no such popular ads

Tested right now in FF too => no such popular ads

Actually, I checked just now too and I don't see any sponsored ad :+1:

@mapx-
Check your email

ok, arrived

Weird, the filter above (still in ublock annoyances list) is working on the saved page you sent me
facebook.com,facebookcorewwwi.onion##.userContentWrapper:has-text(Popular Across Facebook)

Did you enable that list ?

you can try also
facebook.com,facebookcorewwwi.onion##[id^="hyperfeed_story_id_"]:has-text(Popular Across Facebook)

On firefox Android with ublock origin , i see 'popular across Facebook ' with ublock filters annoyance enabled

well, probably it's different on android, I need again a saved page .. but as I know is not simple in android
maybe using an extension like this ?
https://addons.mozilla.org/en-US/android/addon/toggle-web-developer-toolbar/

It shows view source tab only , how can I help you...
Since you have account, can you use emulator like that thing, I previously sent you logs

You saved previously the page on desktop, so it's totally different, I'd need the real android page, I have no android device, so ...

@gwarser has android I think

I don't see any ads on Facebook. Even with cosmetic filtering disabled.

For reproducing as Firefox for Android, it might need to spoof user agent on desktop browser or visit touch.facebook.com

Note: the mobile version that you get on m.facebook.com will depend on user agent, if the browser version didn't modern enough, you will get the basic layout.

I'm less familiar with the syntax use by uBlock, but I was able to hide any sponsored ads on facebook with the below jQuery code int he console. Sponsored content has the timestamp replaced with the word "Sponsored". They do still have the timestamp div, but it's hidden, so fairly easy to spot.

$(".userContentWrapper").each(function(){ elem = $(this); $(this).find(".livetimestamp:hidden").each(function(){ elem.hide(); }); });

Is it possible to match hidden elements? I've come pretty close with the filter ##.userContentWrapper:has(.livetimestamp), but just need to specify that livetimestamp must be hidden.

This filter (from ublock filters) already should work
facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(div[id*="feed_subtitle_"] > span:matches-css(display:none):has(abbr .timestampContent))

That filter is not working. I'll try to chop out parts to figure out what selector is causing it not to match.

I have a test case where the filter above is working (unfortunately I can not publish it for privacy reasons, it was provided by @ghajini ), maybe we are served different cases

However, I can provide the local case (not the entire page)

<div class="_5pcp _5lel _2jyu _232_" id="feed_subtitle_263;164302750336862;0;2548656545234792;1535411929:-1234669899881058812:5:0:27549" data-testid="story-subtitle"><s class="c_1arw8zcj1d y_1arw8zimqp a_1arw8zazy4" data-ft="{&quot;tn&quot;:&quot;j&quot;}"><div class="d_1arw8zh276 q_1arw8zh27k"><div class="g_1arw8zh278 q_1arw8zh27k"><div class="g_1arw8zh278 q_1arw8zh27k"><div class="w_1arw8zh27l q_1arw8zh27k"><div class="d_1arw8zh276 q_1arw8zh27k"><div class="d_1arw8zh276 q_1arw8zh27k"><a class="z_1arw8zjlfh b_1arw8zgf2b l_1arw8zje94" href="https://www.facebook.com/#" role="link" id="u_ps_0_0_g"><span class="d_1arw8zasr6"><span class="q_1arw8zh27k h_1arw8zh279">Sp</span><span class="q_1arw8zh27k f_1arw8zj7l5">S</span><span class="q_1arw8zh27k h_1arw8zh279">on</span><span class="q_1arw8zh27k f_1arw8zj7l5">S</span><span class="q_1arw8zh27k h_1arw8zh279">so</span><span class="q_1arw8zh27k f_1arw8zj7l5">S</span><span class="q_1arw8zh27k h_1arw8zh279">red</span><span class="q_1arw8zh27k f_1arw8zj7l5">S</span></span></a></div></div></div></div></div></div></s><span class="_6spk" role="presentation" aria-hidden="true"> · </span><span class="r_1arw8zbedb"><span class="fsm fwn fcg"><a class="_5pcq" href="https://www.facebook.com/164302750336862/posts/1785950094863969/?__xts__%5B0%5D=68.ARCFa43REvLAaBFP9Cl1QcXRqh6kLqkB_osyMCqvecS2lkuxXibIOWOjpphmf0V-2Vk-IUdTl97hG2QWK09Bq_gq_fraWSRIFBKM8k_k7eFJ3uDD2jWs1aiEH4DrBKDdOlrRAwSApMuzxCwRU5FToEH4yf0-Gso-g4squgKwTS6s1_JpB8tnmBF6f1Q_YTXBMnMp947B0ZN5DkssO-tTwP75wQ&amp;__tn__=-R" target=""><abbr title="18/11/2018 04:57" data-utime="1542497248" data-shorten="1" class="_5ptz timestamp livetimestamp"><span class="timestampContent" id="js_w">14 hrs</span></abbr></a></span></span><span class="_6spk" role="presentation" aria-hidden="true"> · </span><a class="uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator _5pcq" aria-label="Public" href="https://www.facebook.com/#" role="button" data-hover="tooltip" data-tooltip-content="Public" id="js_30"><i class="lock img sp_YoWDyX4Q8Xb sx_ba1aff"></i></a></div>

where the timestamp is inside here:

.r_1arw8zbedb {
    display: none;
}

Cutting it down to this worked for me. Looks like there's an issue trying to match the id "feed-subtitle"

##div[id^="hyperfeed_story_id_"]:if(div > span:matches-css(display:none):has(abbr .timestampContent))

Could you test
facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(div[id*="feed_subtitle_"] > span:if-not(span>div a[role="link"]:matches-css(display: none))

That did not match anything.

They seem to have gone back and forth between 'feed_subtitle' and 'feed-subtitle'. Try the uBlock filters expression with 'feed.' excised:

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(div[id*="subtitle"] > span:matches-css(display:none):has(abbr .timestampContent))

I believe that solves it quite neatly.

These guys act quick. Now the div is named "feed_sub_title_128;1402960186614717;0;2216051248638936;1542673577:-7185000746684546330:5:0:47233"

Did you test a filter like this
facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(div[id*="title"] > span:matches-css(display:none):has(abbr .timestampContent))

I did, and that works, although I wouldn't be surprised if they now break it out to feed_s_u_b_title or some other variant. We may do best to try identifying ads using some other property.

In the more immediate term, testing a more generalized version of the filter without testing the id of the div seems to work too without removing any other elements of the page as far as I can tell.

div[id^="hyperfeed_story_id_"]:if(div > span:matches-css(display:none):has(abbr .timestampContent))

EDIT: They've already invalidated that fix too. Now there's not abbr tag with timestampContent class.

This works . . . for now

##div[class*="userContentWrapper"]:has(div > div > div[data-ad-preview="message"]):has(a[role="button"][target="_BLANK"])

Edit2: That's only a partial fix. It only targets ads with a button below that says "Watch more" "Shop now" etc.

Does anyone else get the "actor-selector" option under ads? I run pages as well, and it allows me to post as myself, or as a page, which it only shows on ads. This might be another way to isolate ads.

In xpath something like this should work /div[contains(translate(@id, "_-", ""), "feedsubtitle")] but matches-css will be lost.

@0Kills

In the more immediate term, testing a more generalized version of the filter without testing the id of the div seems to work too without removing any other elements of the page as far as I can tell.

##div[id^="hyperfeed_story_id_"]:if(div > span:matches-css(display:none):has(abbr .timestampContent))

This applies the expensive matches-css(display:none) to every single div > span in each post's DOM. Narrowing down to the 'feed subtitle' branchlet of each post cuts down the number of matches-css() calls (== window.getComputedStyle() calls) by a factor of 3 or so.

All the 'id approximately-equal feed_subtitle' stuff can be replaced by '._5pcp'. I've only avoided that because using the mangled FB CSS identifiers is icky. But they don't seem to change rapidly, in fact far less rapidly than the readable bits. So this should work and be reasonably stable (but I have not tested):

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:if(._5pcp > span:matches-css(display:none):has(abbr .timestampContent))

And, of course, the FB engineer who's making all these changes is probably reading this public thread. So I say to them: _please, drop it_. People who dedicatedly do not want ads are going to find a way, even if that way is 'well, you succeeded in driving me off your platform'. This cat-and-mouse game is counterproductive.

(* I have not tested, because I'm working in a completely different filtering engine with different capabilities & syntax. The conceptual test does work; I am not 100% confident of my translation of it into the less-familiar-to-me uBO cosmetic filter language.)

Ok, using what I'd suggested before this seems to work really really well and would require facebook to severely alter the layout of the timeline to block it. Only issue is I don't know if it will work for everyone. I have multiple pages I manage, so I have the "actor selector" option in the bottom right corner of ads, which I don't get on any non-ad posts. This line targets posts that have the actor selector

##div[class*="userContentWrapper"]:has(span[data-testid="actor-selector"])

I just loaded up an FB News Feed tab with 477 posts in it; which included 24 Sponsored posts. Search for '[data-testid="actor-selector"]' finds zero elements. So that may work for you, definitely is not universal.

And they would have to go to zero effort to block that -- just add a meaningless stub <span data-testid="actor-selector"></span> to all posts. (Possibly with class="hidden_elem" to have no visual effect. Or some other CSS shenanigans to make it harder to detect.)

Oh -- I think you're saying that's a special widget which appears if your personal FB account is associated with FB page accounts, so that you have the pulldown to choose which account to comment as. So yeah, it would only work for such accounts. Such a filter might indeed have good longevity, since it's for a restricted audience and is less likely to come to FB's notice or care. But also of limited benefit.

Shame it won't work for everyone, but I think you're mistaken about how easily facebook might remedy it. I've tried dropping data-testid="actor-selector" into spans on people's posts and the entire post disappears when I do. This represents meaningful data to some script running on the page and causes it to treat the post differently.

Would someone who doesn't manage any pages be willing to share a pastebin of a few div's worth of posts with & w/o ads? I understand if nobody would, for security reasons, but this issue is bothering me more probably, than it should.

If dropping it in causes the post to disappear, that's probably your uBO expression at work. It does nothing to posts on my FB. But then, maybe it's FB code which is only active if you manage a Page.

There is nothing quite that trivial to recognize in my Sponsored posts. (There was, but they fixed it recently.)

Are you sure that the thing you're looking for doesn't also appear in Group and/or non-Sponsored Page posts which appear in your feed?

D'oh. You're right it was just uBO.

I don't see this in group posts though. I can still see them just fine.

I was speculating that the same selector might appear on posts in your main News Feed (https://facebook.com), for posts inserted from other sources. The HTML structure of the same post is different in News Feed vs. in their actual home Group (https://facebook.com/groups/group-name-string) or Page (https://facebook.com/page-name-string) pages.

You need to verify that Group & Page posts which have been slipstreamed into your News Feed are not blocked by your expression. (Page posts which weren't paid for only appear in your feed if you've 'liked' that Page, which is FB's way of more-or-less subscribing to a Page; those are legitimate content which shouldn't be blocked.)

I can definitely see posts to groups. Pages are harder to verify because I don't "like" anything. Any suggestions on a page that posts very frequently I can use to test?

Hmm. If you 'like' each of:

https://facebook.com/KQED
https://facebook.com/ubuntulinux
https://facebook.com/newegg

you cannot fail to see several Page posts a day...

Spending more time on code, I haven't been following filter issues that much...

https://twitter.com/aaronkbr/status/1071214578980261888

wth

I am going through uBO's filters for facebook.com and I see this one:

facebook.com,facebookcorewwwi.onion##.userContentWrapper>div div>span>span:has-text(^Suggested Post$)

This accomplishes nothing. If you want to use regex as the thing to search, you have to be explicit about it by using /.../:

facebook.com,facebookcorewwwi.onion##.userContentWrapper>div div>span>span:has-text(/^Suggested Post$/)

Also, we have to always keep in mind procedural filters are not cheap, it's JavaScript having to be executed to scan the DOM for each single operator in each single filter and each time the DOM changes, so this needs to be taken into account when crafting such filters. See https://twitter.com/aaronkbr/status/1071585252978638848.

Blocking individual sponsored advertisers with individual filter seems to be pain @mapx-
Any solution apart from that

I am maintaining an extension for blocking just Facebook Sponsored posts here:
https://github.com/mohamedmansour/fblock/blob/master/scripts/facebook-adblocker.js#L74

Basically, all you do with this new update is to query the following for each "post"

  function findSponsoredPost(node) {
    const role = node.querySelector('a[role="link"]')
    if (!role) 
      return null

    return getComputedStyle(role).display !== 'none' ? node : null
  }

That query selector just matches that "Sponsored" section 100% of the time.

This works
https://GitHub.com/tiratatp/facebook_adblock

That query selector just matches that "Sponsored" section 100% of the time.

So theoretically, this uBO filter should work?

facebook.com##div[id^="hyperfeed_story_id_"]:has(a[role="link"]:if-not(:scope:matches-css(display: none)))

I do not have a facebook account, so I can't test this. If this works, probably a good idea to further inevstigate whether the a[role="link"] part can be made more specific so as to reduce the set of nodes for which :if-not() will be executed.

facebook.com##div[id^="hyperfeed_story_id_"]:has(a[role="link"]:if-not(:scope:matches-css(display: none)))

Does not work for me. And it also causes repeatedly refreshing of my newsfeed items so that only sponsored ads are shown, no normal posts. And I see the sponsored ad on the right hand column.

See two sponsored posts in a row plus the one on the right. (Deliberately cropped the top right)
image

Does not work for me.

Well without a facebook account to test these myself I am not going to be very useful -- I'm just adding noise in here in the end.

@terrorist96

  • so, with the existing filters you still get sponsored ads.
  • could you save the page with ads (page + folder => zip them together) and send the zip (or the link) to this email
    [email protected] ?

@terrorist96

  • so, with the existing filters you still get sponsored ads.
  • could you save the page with ads (page + folder => zip them together) and send the zip (or the link) to this email
    [email protected] ?

Yes. I've been seeing ads on Facebook for many weeks now. I'll send you an email later today. Thanks.

So theoretically, this uBO filter should work?

facebook.com##div[id^="hyperfeed_story_id_"]:has(a[role="link"]:if-not(:scope:matches-css(display: none)))

Yes, in my fblock extension, that is what I do, it looks like the following. I match the first role from each article, so in ublock need to get the article match.
image

This is all error prone, with the incremental deployments that Facebook does once every day, they could change the classnames. The best to do is just delete Facebook. uBlock should add a Header stating

Facebook is an unethical company which wants to own your own data, and show you ads without any way of removing them, even if we wish to pay, #deletefacebook

@terrorist96 if are you who sent me the zip, I tested it and already works with the filters in ublock filters.
Could you update the lists and test again ?

@mapx- yes it was me. I just updated my filters and I still see the sponsored ad on the right column but don't see sponsored stories on the feed.

ok, for the right sponsored test
facebook.com,facebookcorewwwi.onion##.ego_section:has(a[href*="/ad___campaign"])
or
facebook.com,facebookcorewwwi.onion##.ego_section:has(a[href*="campaign_id"])

I wonder if a blocking approached based on aria labels or other accessibility features would work better since those are required to be machine readable which could prevent facebook from effectively obfuscating them.
See:
https://www.facebook.com/help/accessibility
https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA

ok, for the right sponsored test
facebook.com,facebookcorewwwi.onion##.ego_section:has(a[href*="/ad___campaign"])
or
facebook.com,facebookcorewwwi.onion##.ego_section:has(a[href*="campaign_id"])

They both work. Please merge at least one. Thanks!

They both work. Please merge at least one. Thanks!

yeah, already done above, thanks for sending the test case

further inevstigate whether the a[role="link"] part can be made more specific so as to reduce the set of nodes for which :if-not() will be executed.

This is not necessary as there is a maximum of one a[role="link"] per FB post.

The expression given above was backwards; and should include the onion site. Try:

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:has(a[role="link"]:if(:scope:matches-css(display: none)))

As I read it, it seems like the original should be correct and my 'backwards' one should be wrong. But when tested, in practice, it works as I said. The original (from @gorhill, ~7 hours back) causes all posts _except_ ads to be hidden; this one hides only ads.

BBC might note that github usernames are clickable links which may lead to a person's real name; and that it is frustrating to see an article with no byline, feedback button, or comments area.

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:has(a[role="link"]:if(:scope:matches-css(display: none)))

To test, I disabled uBlock filters, confirmed ads on facebook, then tried your code, and I see both feed and right column ads. Unless it relies on other code in uBlock filters that is disabled, that code doesn't work on my end.

Oh frick, I didn't disable the rest of uB filters when I tested that, may well have been tricked.

I did test that gorhill's version (with ':not-has()') hid 100% of all posts.

He's far more expert at uB filter language than I am. The concept we're trying to capture is:

on facebook.com,facebookcorewwwi.onion,
for each div[id^="hyperfeed_story_id_"],
if it has an a[role="link"] which is hidden,
it's an ad (and should be trimmed at the hyperfeed_story_id point)

I think I came up with a much better way to prevent facebook from breaking the filters, see my code here(it's kinda hacky but should be a decent proof of concept) which adds the new :has-visible-text filter.

It uses a recursive parser to extract only visible text from child elements, here's an example filter that goes with it:

facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:has(div[id^="feed_sub_title_"]:has-visible-text(Sponsored))
facebook.com,facebookcorewwwi.onion##div[id^="hyperfeed_story_id_"]:has(div[id^="feed_sub_title_"]:has-visible-text(Sponsored))

To test, I disabled uBlock filters, confirmed ads on facebook, then tried your code, and I see both feed and right column ads. Unless it relies on other code in uBlock filters that is disabled, that code doesn't work on my end.

@terrorist96 You'll need to check out this branch as the filter relies on the new has-visible-text method I added there. The proof of concept filter is currently only tested against feed posts but it should be fairly straight forward to adapt to the sidebar posts.

Ok I'll test again if that gets approved/merged and the extension update is pushed out.

I've uploaded a chromium test build here which can be installed manually if you want to try it.

I've uploaded a chromium test build here which can be installed manually if you want to try it.

Ok just tested it. Confirm that it blocks the feed ad, but not the sidebar ad (as expected). Very cool!

Cool, the technique I came up with works by recursively walking all the elements below the target node while pulling the computed style for each individual node, if it comes across a node with a style identifier that will cause that node to not be visible it simply skips that node and any children. Since facebook seems to sometimes use parent nodes to hide children this technique appears to filter out the false positive traps they have(there may potentially be other styles that hide nodes that I've missed but those should be fairly straight forward to add and facebook will likely eventually run out of them).

@jameshilliard that approach can work. There are a number of concerns:

  • it's a fairly expensive JavaScript exercise you're wanting to conduct on potentially a lot of divs below 'feed subtitle'

  • varied hiding techniques: I've already seen them use 'display:none' and 'font-size:0px' (or equivalent). I can imagine others, like giving them a large negative position, or who knows what else. Same color foreground and background, coupled with negative kerning to pull up the gaps?

  • is your evaluation anchored below the starting point or below the entire HTML page? I'm working in an environment where we hide individual posts -- not permanently, but as a matter of dividing them up into 'tabs' according to search criteria. If your evaluation is anchored at the top of the DOM, you will see every single shred of one of those hidden posts as ... hidden. No useful 'sponsored / not sponsored' determination can be made. However, if your evaluation is anchored at the top of the post ( with id like 'hyperfeed_story_id_gibberish' [except that can vary in different contexts]) -- then this approach will succeed. Um. It would have to ignore the display attribute of that top div._5jmm, which is exactly where we hide / show the post.

it's a fairly expensive JavaScript exercise you're wanting to conduct on potentially a lot of divs below 'feed subtitle'

Yeah, I'm not really sure if there's a more efficient alternative, at least this filter can be targeted at only nodes that actually require it. Facebook will likely stop using this obfuscation method if it becomes ineffective.

varied hiding techniques: I've already seen them use 'display:none' and 'font-size:0px' (or equivalent).

I think this method should catch both of those at least.

I can imagine others, like giving them a large negative position

That may be tricky for them to pull off on these elements due to where they are being anchored, I expect this will go through a few rounds of cat and mouse with facebook before they run out of ideas. It should at least be much more effective than the current blocking methods since they can trivially randomize various identifiers.

is your evaluation anchored below the starting point or below the entire HTML page?

The recursive function does evaluation on each feed_sub_title_ node but hides the parent hyperfeed_story_id_ node.

The recursive function does evaluation on each feed_sub_title_ node but hides the parent hyperfeed_story_id_ node.

Right, that's as expected. My question is ... I don't know if I know the right terminology. Suppose I've already set the hyperfeed_story_id node to display:none (but it's temporary and I provide a user interface for users to toggle it). When you evaluate whether some deep sub-node is display:none (or otherwise hidden), are you tricked by my outer display:none? I suspect yes, if you're using getComputedStyle(). You would have to use a private implementation which is able to anchor its evaluation below that node, for it to be otherwise.

Or, I would have to somehow figure out how to coordinate so that my processing runs after ad blockers'. hmmm.

If a parent node is display:none all child nodes would not be visible right?

Yes of course. But, besides the extension I work on toggling on and off individual posts, FB's own code plays all sorts of shenanigans with the display property of individual posts and tranches of posts. If you're evaluating things on a basis of visibility when FB has hidden everything, you will be tricked in either false-positive or false-negative direction. Maybe your processing always gets in before the FB foolery.

Was a fix ever merged?

I have been seeing ads for months now.

See also:
https://github.com/easylist/easylist/issues/2524

Try:

facebook.com##[id^="hyperfeed_story_id_"]:has(s[data-ft]:matches-css(display: inline))

@gwarser seems to filter out all of the posts.

@Uricorn you could save a page with ads, zip folder + html page and send the zip here:
[email protected]

@mapx- sent.

like I said: I need **folder + html page**, zip them together, upload the zip on some server and send me only the link to the zip (otherwise gmail could block the download)

use "save page as.." to get folder + html

As suggested on this thread, I was using the following filter to remove ads from facebook:
www.facebook.com##[id^=hyperfeed_story_id_]:has([id*=feed_subtitle_]):if(a:if(span:has-text(SpSonSsoSredS)):matches-css(display: inline))

However, it stopped working a few days ago.
When I checked the page's source code, I noticed some new elements on the block that creates the SpSonSsoSredS string.
Because of those elements, I cannot find the it anymore when I use C-f on firefox to search it for.
I guess this is the reason why :has-text(SpSonSsoSredS) does not work anymore.
I tried to match the values shown on the source code, but could not match anything more than SpS.

Checking the wiki, I learned that a regular expression can be used in the has-text function.
Then, I implemented the following rule to match the displayed "Sponsored" string:
facebook.com##[id^=hyperfeed_story_id_]:has([id*=feed_subtitle_]):has(a:has-text(/Sp.*on.*so.*red/))
(I'm not sure about each element on between the wildcards, because I'm using a different language, but it should work after some small adjustments).

After adding that rule, I did not see ads anymore.
I also tested it using the element picker, and it did not match any other post that wasn't a sponsored one.

@rgamici Thanks for this. However yours did not block "Sponsored" posts in my feed, and after investigating I noticed that the obfuscated "Sponsored" text was in a <span> not a <a>, so I made one small change to your filter:

facebook.com##[id^=hyperfeed_story_id_]:has([id*=feed_sub_title_]):has(span:has-text(/Sp.*on.*so.*red/))

And this works for me.

@mholt The <span> elements and some <div>s are inside an <a> on my source file, and are also obfuscated by <span> or <div>, I'm not sure which as both appear on the same positions.
It might be a different template used by facebook to try to obfuscate the adblockers.

I tried to change it to span:has and div:has and both worked for me.
Even a simpler version works:
facebook.com##[id^=hyperfeed_story_id_]:has([id*=feed_subtitle_]):has-text(/Sp.*on.*so.*red/)
I tried the other one because I was scared of some false positives.
But, I think this new one might be enough as has([id*=feed_subtitle_]) will guarantee that it only matches that specific text that it is either Sponsored or the post publication date.

If it helps, here's a screenshot of what its structure for me: https://twitter.com/mholt6/status/1092191140168622080

The expressions being discussed _might_ work for you. They will not work for the general populace and should not be committed into the public filter definitions.

The feeds being sent by Facebook to most users contain those same 'Sponsored'-with-gibberish elements in _EVERY_ post. Those expressions will hide all posts.

another filter proposed on reddit
facebook.com##div[id^="hyperfeed_story_id_"]:has(span:has-text(/^d$/))

Small trick: use .*? instead of .*.

'sponsored word'.match(/s.*d/)
Array [ "sponsored word" ]
'sponsored word'.match(/s.*?d/)
Array [ "sponsored" ]

About ?:

If used immediately after any of the quantifiers *, +, ?, or {}, makes the quantifier non-greedy (matching the minimum number of times), as opposed to the default, which is greedy (matching the maximum number of times).

I'm sure this breaks regular non-ad "pages" showing up in someone's timeline, but maybe it will be useful for people who also don't care about "pages".

Pages seem to (for now) use the format of
https://www.facebook.com/herowarsgame/?__tn__=kC-R&ei...
While user profiles use
https://www.facebook.com/myfriendsname?__tn
Note the missing '/'. Thus if you want to be really aggressive you can just block everything in a usercontentwrapper that links to a page in a different "directory".

div[class="userContentWrapper"]:has(a[href='facebook'][href*='/?'])

Just somehow counts the child divs, if more than 6 -> ads, normal feed item doesnt have this crap

https://pastebin.com/bYCcc5iV

Some normal feed posts have exactly the same crap in them, just a slightly different structure of gibberish CSS classes which overall means 'don't show any part of this'. Counting divs will hide regular posts.

Those are semi-randomly generated, might be stable for your single account for a few hours or days, but that specific gibberish won't apply to other users. And, at least for some users and some messages, FB are including the same gibberish in normal non-sponsored posts, hidden by CSS.

I've worked out a filter that appears to work..

The way the "Sponsored" text works is this:

image

It has a <span> with a direct child <span>. The child <span> has a single letter in it.

Some child <span> are hidden which contain "fake" letters to obfuscate the word. I assume that these are randomly generated and change.

So the filter is this:

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span:has(span:has-text(/^S/)):has(span:has-text(/^p/)):has(span:has-text(/^o/)):has(span:has-text(/^n/)):has(span:has-text(/^s/)):has(span:has-text(/^o/)):has(span:has-text(/^r/)):has(span:has-text(/^e/)):has(span:has-text(/^d/)))

Translation:

A hyperfeed div

That has a span

That has a child span starting with S
That also has a child span starting with p
That also has a child span starting with o
That also has a child span starting with n
That also has a child span starting with s
That also has a child span starting with o
That also has a child span starting with r
That also has a child span starting with e
That also has a child span starting with d

@psylenced please see my last two comments.

FYI, the following seems to work fine for me: (credits to /u/Trminator85 on Reddit)
facebook.com,facebookcorewwwi.onion##[id^="hyperfeed_story_id_"]:has([data-testid="story-subtitle"] [role="link"])
Can anybody confirm?

@filbo my solution works with randomly placed letters.

Please provide me some constructive feedback as to how it doesn't work. If you're unable to understand the solution please do not comment.

Ay yay yay

@psylenced Your filter works for me atm

Instead, I want to lookdown the entire feed element ( div[id^="hyperfeed_story_id"] ), both ads post and non-ads to see what's any different, especially some ads posts will insert external links or have special hyperlink that can identified is the posts is ads post or not.

None of the filters work for me..

Looks like my fix from above was broken, due to them renaming span tags to s tags:

image

Fixed filter is to change the tag names in the filter above:

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span:has(s:has-text(/^S/)):has(s:has-text(/^p/)):has(s:has-text(/^o/)):has(s:has-text(/^n/)):has(s:has-text(/^s/)):has(s:has-text(/^o/)):has(s:has-text(/^r/)):has(s:has-text(/^e/)):has(s:has-text(/^d/)))

However it appears that this is only used in sponsored posts, allowing the much simplified filter of:

www.facebook.com##div[id^=hyperfeed_story_id_]:has(s)

The longer filter above is "more correct" which will be very difficult to have false positives.

The simpler one seems to only target sponsored posts at the moment, but I can't guarantee they haven't or won't in the future introduce s tags to regular posts to try and trick that simple filter.

They've been turning on and off 's' tags in both Sponsored and regular posts for months now.

Thanks @filbo , I've only just linked in with this issue when I started noticing ads recently.

If they are alternating between tags, then adding both filters should do the job:

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span:has(s:has-text(/^S/)):has(s:has-text(/^p/)):has(s:has-text(/^o/)):has(s:has-text(/^n/)):has(s:has-text(/^s/)):has(s:has-text(/^o/)):has(s:has-text(/^r/)):has(s:has-text(/^e/)):has(s:has-text(/^d/)))

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span:has(span:has-text(/^S/)):has(span:has-text(/^p/)):has(span:has-text(/^o/)):has(span:has-text(/^n/)):has(span:has-text(/^s/)):has(span:has-text(/^o/)):has(span:has-text(/^r/)):has(span:has-text(/^e/)):has(span:has-text(/^d/))

And when they start mix-and-matching span and s tags? Or invent another, since HTML really doesn't care?

These filters are things which will work for one person, for a couple of days, until FB send them a different one of their rotating file of varied obfuscation devices.

(I also imagine that a chain of :has-text() that deep has to be astonishingly inefficient. In the 's' case that's not a real problem since most things won't be 's' tags, so not much needs to be examined. In the 'span' case you're potentially launching a tremendous effort on each post which goes by.)

And when they start mix-and-matching span and s tags? Or invent another, since HTML really doesn't care?

Then the filter will get updated. Thus why this issue has over 180 comments and the facebook filter has been changed over many iterations.

(I also imagine that a chain of :has-text() that deep has to be astonishingly inefficient.

The filter will be run once per hyper-feed story. Most facebook feeds have 10 or so. As soon as a chain fails, it wont check the rest. So for non-ads It'll do 2-3 checks deep per story. For ads it'll check the whole thing. That's 30 "checks" per page load. Considering javascript can run many thousands of operations in a second and css is the same - the load will be minimal.

I've noticed it's been getting false positives as they are inserting hidden "sponsored" tags in the middle of regular posts.

##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtitle"]:has(span[data-ft]:has(s > s)))

The above filter works with html only and it doesn't rely on any specific language or words so I assume it'd work with all regions.

I'm now getting "Similar to Posts You've Interacted With" posts

For me only the following short filter by @psylenced works :

www.facebook.com##div[id^=hyperfeed_story_id_]:has(s)

Cut all post with small "s"?

only the posts with div "s"

facebook.com##div[id^="hyperfeed_story_id_"]:has(div:has-text(/^[Similar to Posts You've Interacted With]{9,}$/))

works for "similar to posts you've interacted with", but only until facebook starts inserting those bloody obfuscations in these ones too

owwww

Facebook ads are not blocked.

My current set:

www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtitle"]:has(span[data-ft]:has(s > s)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtilte"]:has(span[data-ft]:has(s > s)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtitle"]:has(span[data-ft]:has(span > span)))
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))

This rule works for me:
facebook.com##div[id^=substream]:has(div[data-testid=story-subtitle]>span:first-child[data-ft])

FB really are using misspelled 'story-subtilte' and will probably get worse.

@krystian3w - the typo was on their side.

It was originally the correct spelling, then a few weeks ago they messed it up. Then in the last day it's back to the correct spelling.

It took me ages to work out why it wasn't working, because I didn't notice the typo when I was trying to test the fix.

I don't think it's a typo. They keep changing the orthography of various things. For instance, the ID of the subtitle divs has variously been:

id="feed-subtitle-[numeric stuff]"
id="_feed_subtitle_[numeric stuff]"
id="feed_sub_title_[numeric stuff]"
id="feed_subtitle_[numeric stuff]"

over the last year. These small tweaks look like they're meant to break ad blockers; and of course the ad blockers catch on quickly, so FB keep making similar changes to try to stay ahead. If that means misspelling a word for a while, they are not too proud to do that.

Can we get a permanent solution rather then playing cat-n-mouse?

Can we get a permanent solution rather then playing cat-n-mouse?

Only if FB stop playing cat. Or mouse. Whichever role you conceive of them in.

Only if FB stop playing cat. Or mouse. Whichever role you conceive of them in.

Then its time to shove some AI in ublock.

BetterList : Then its time to shove some AI in ublock.

I guess u mean:

Try https://github.com/kowith337/PersonalFilterListCollection/blob/17addb562d5cc79de06a40b2f0b96b773b3725f6/filterlist/facebook/FacebookZuckestionKiller.txt#L360

Can we add that text file as a list (so that we don't have to manually copy and paste every time that txt file gets updated)?

Update: I added the raw version of the file (i.e. https://raw.githubusercontent.com/kowith337/PersonalFilterListCollection/17addb562d5cc79de06a40b2f0b96b773b3725f6/filterlist/facebook/FacebookZuckestionKiller.txt ). It successfully removes Sponsored posts for me! Thanks for sharing @kowith337

UPDATE 2: 30 minutes later, I see Sponsored Posts again. :(

Try no use link with random commit id, but add master (latest) version:

https://github.com/kowith337/PersonalFilterListCollection/raw/master/filterlist/facebook/FacebookZuckestionKiller.txt

@krystian3w Thanks for your reply. I removed the URL I shared in https://github.com/uBlockOrigin/uAssets/issues/3367#issuecomment-474198324 and used your "master (latest)" one, but I still see sponsored posts. Facebook is so clever in getting us ad-haters to see unwanted ads. :P

@hub2git @krystian3w I just point only the specific line ref, I didn't think it can remove actual sponsored posts with the specific data that I've pointed (the directed_target_id inside hyperfeed_story_id), I first try to hide "Recommended events" that promoted at the beginning of news feed, and yes, they can resolve what we do.

Updated current set:

www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtitle"]:has(span[data-ft]:has(s > s)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtilte"]:has(span[data-ft]:has(s > s)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtitle"]:has(span[data-ft]:has(span > span)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtilte"]:has(span[data-ft]:has(span > span)))
www.facebook.com##.pagelet-group > .pagelet:has(a:has-text(/Sponsored/))

Updated current set:

www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtitle"]:has(span[data-ft]:has(s > s)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtilte"]:has(span[data-ft]:has(s > s)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtitle"]:has(span[data-ft]:has(span > span)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtilte"]:has(span[data-ft]:has(span > span)))
www.facebook.com##.pagelet-group > .pagelet:has(a:has-text(/Sponsored/))

Hello, @psylenced
Would you have a github master filterlist, like what @kowith337 created? That way, I can subscribe to your set and my ublock origin will stay updated automatically. :)

UPDATE: I just added your code to my uBO's "My Filters" tab. Unfortunately, I still see "Sponsored Posts".

So filter again outdated.

Unfortunately for my side, yes for desktop version, I'm also giving up to hide sponsored posts injection for now.

However, other unwanted things seems to be fine to hide, as well as mobile version. (both basic and touch site)

I think innerText might be useful for breaking the obfsucation. I have a somewhat working example here.

Latest one for me:

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span[data-ft="{\"tn\":\"j\"}"])
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))

Has-text works fine:
facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^=feed_subtitle_]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d/))

On my particular obfuscated page, the id is feedsubtitle_ not feed_subtitle_. Previous filters would have worked except there are new invisible dashes.

facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^=feedsubtitle_]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d/))

Is it possible to filter
feedsubtitle_128;6002238585;0;1841736995932488;1553786297:9066917991254322631:5:0:62438

by changing something like this to find the the ID that starts with "feed_subtitle_" or feedsubtitle_" then some random characters :
facebook.com##:xpath(//div[@id="stream_pagelet"]//div[starts-with(@id,"feed_subtitle_|feedsubtitle_")][.//h6//span/has-text("/S.*p.*o.*n.*s.*o.*r.*e.*d/")])

Obviously I don't know what I'm doing.

Not tested.

...[starts-with(@id,"feed_subtitle_") or starts-with(@id,"feedsubtitle_")]

...[starts-with(translate(@id, "_", ""), "feedsubtitle")] (slower?)

facebook.com##div#stream_pagelet div[id^="feed"][id*="subtitle"]:has(h6 span:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d/))

Current working (for me):

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span[data-ft="{\"tn\":\"j\"}"])
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Create ad))

For in-feed "Sponsored" posts.

www.facebook.com##div[id^=hyperfeed_story_id_]:has(a[role^=button]:has(> span:has-text(/S/i):has-text(p):has-text(o):has-text(n):has-text(r):has-text(e):has-text(d):not(:has-text(0)):not(:has-text(1)):not(:has-text(2)):not(:has-text(3)):not(:has-text(4)):not(:has-text(5)):not(:has-text(6)):not(:has-text(7)):not(:has-text(8)):not(:has-text(9))))

Filter to zap out the sponsored post and nothing else
facebook.com##div[id^="hyperfeed_story_id_"]:not(div:contains(/^[class="timestampContent"])):not(span:contains(/^m$/)):not(span:contains(/^M$/)):not(span:contains(/^h$/)):not(span:contains(/^:$/)):not(span:contains(/^J$/)):has(span:contains(/^S$/))

Current working (for me):

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span[data-ft="{\"tn\":\"j\"}"])
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Create ad))

Filter to zap out the sponsored post and nothing else
facebook.com##div[id^="hyperfeed_story_id_"]:not(div:contains(/^[class="timestampContent"])):not(span:contains(/^m$/)):not(span:contains(/^M$/)):not(span:contains(/^h$/)):not(span:contains(/^:$/)):not(span:contains(/^J$/)):has(span:contains(/^S$/))

Tried both of these and it removed everything inc friends and group posts but kept "Pages" that I've liked.

youtube.com##.ytp-ce-element
www.youtube.com##.ytp-cards-teaser
facebook.com##.userContentWrapper :has([id^="feed_subtitle_"]:has-text(Sp))
facebook.com###substream_1:has([id^="feed_subtitle_"]:has-text(Sp))
facebook.com##body:xpath(//i[text()[contains(.,'Sponsored')]]/ancestor::div[11])
www.facebook.com##.userContentWrapper._5pcr > div:has(.r_zjlob1xpb)
www.facebook.com##.userContentWrapper._5pcr > div:has(.s_v8i43c603)
www.facebook.com##div[id^=hyperfeed_story_id_]:has(span[data-ft="{\"tn\":\"j\"}"])
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Create ad))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(a[role^=button]:has(> span:has-text(/S/i):has-text(p):has-text(o):has-text(n):has-text(r):has-text(e):has-text(d):not(:has-text(0)):not(:has-text(1)):not(:has-text(2)):not(:has-text(3)):not(:has-text(4)):not(:has-text(5)):not(:has-text(6)):not(:has-text(7)):not(:has-text(8)):not(:has-text(9))))
facebook.com##div[id^="hyperfeed_story_id_"]:not(div:contains(/^[class="timestampContent"])):not(span:contains(/^m$/)):not(span:contains(/^M$/)):not(span:contains(/^h$/)):not(span:contains(/^:$/)):not(span:contains(/^J$/)):has(span:contains(/^S$/))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(span[data-ft="{\"tn\":\"j\"}"])
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Create ad))

facebook.com##[id^=hyperfeed_story_id_]:has(a[href*="client_token"])
facebook.com##[id^=hyperfeed_story_id_]:has(a[href*="utm_campaign"])
facebook.com##[id^=hyperfeed_story_id_]:has([id^=u_fetchstream_2_1]:has-text(SpSonSsoSredS))
facebook.com###substream_1:has([id^="feed_subtitle_"]:has-text(Sp))
facebook.com###GroupDiscoverCard_Local
facebook.com###GroupsRHCSuggestionSection
facebook.com###fbpage_invite_audience_action
facebook.com###fbpage_invite_audience_action_finch
facebook.com###feed_optimistic_video
facebook.com###friend_invites_section
facebook.com###home_sponsor_nile
facebook.com###left_nav_section_nodes ul li[id="navItem_124024574287414"]
facebook.com###left_nav_section_nodes ul li[id="navItem_275254692598279"]
facebook.com###left_nav_section_nodes ul li[id="navItem_343553122467255"]
facebook.com###left_nav_section_nodes ul li[id="navItem_399711043500146"]
facebook.com###left_nav_section_nodes ul li[id="navItem_456900714360021"]
facebook.com###left_nav_section_nodes ul li[id="navItem_526732794016279"]
facebook.com###left_nav_section_nodes ul li[id="navItem_645191315628772"]
facebook.com###left_nav_section_nodes ul li[id="navItem_762992637108088"]
facebook.com###left_nav_section_nodes ul li[id="navItem_1728807357362356"]
facebook.com###marketplace_bsg_explore_div #sale_groups_landing_page_recommended_groups div[id^="group_browse"] div[id^="GroupSuggestionCard"]
facebook.com###mobile_login_bar
facebook.com###pageInviteNoticeCard
facebook.com###page_recommendations #recommendations_create_entrypoint_container
facebook.com###page_suggestions_on_liking
facebook.com###pagelet_ads_when_no_friend_list_suggestion
facebook.com###pagelet_advertiser_panel
facebook.com###pagelet_ego_pane
facebook.com###pagelet_explore_feed div[role="article"] .fbUserStory span.uiLikePageButton
facebook.com###pagelet_games_rhc
facebook.com###pagelet_group_mall div[id^="group_mall"] div[id^="mall_post"][id*="SUGGESTED_IN_MALL"]
facebook.com###pagelet_main_column_personal #fbSuggestionsPlaceHolder
facebook.com###pagesTimelineChainingUnit
facebook.com###pages_may_like_section
facebook.com###pages_side_column div > div[id^="PageRelatedPagesSecondaryPagelet"]
facebook.com###pages_side_column div a[href*="/friend_inviter_v2/"]
facebook.com###permalink_related_videos_logged_out
facebook.com###video_permalink_related_pagelet
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtitle"]:has(span[data-ft]:has(s > s)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtilte"]:has(span[data-ft]:has(s > s)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtitle"]:has(span[data-ft]:has(span > span)))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="story-subtilte"]:has(span[data-ft]:has(span > span)))
www.facebook.com##.pagelet-group > .pagelet:has(a:has-text(/Sponsored/))
www.facebook.com##div[id^=hyperfeed_story_id_]:has(span[data-ft="{\"tn\":\"j\"}"])
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))

So... will this be added to uAssets? It would be nice to finally be free of ads on Facebook (and more importantly, have my less technically inclined family freed from ads on Facebook).

I have noticed that the sponsored text detection mechanism is getting more and more cumbersome in facebook, as now they have introduced hidden characters between the alphabets in Sponsored, which would effectively make it difficult to do a text match. Currently the only rule that works for me to completely remove such Sponsored posts is :

www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[id^=fbfeed__sub_header__id_]:has(span[data-ft="{\"tn\":\"j\"}"]))

I cannot vouch for any false positives with this rule, but as far as I could check with over 100 sample posts, this successfully removed sponsored posts without affecting others.

Current working (for me):

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span[data-ft="{\"tn\":\"j\"}"])
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Create ad))

I haven't had to change the above since April.

Haven't seen a single ad since I added those filters.

Has been working perfectly for me, for 3 months.

Current working (for me):

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span[data-ft="{\"tn\":\"j\"}"])
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Create ad))

I haven't had to change the above since April.

Haven't seen a single ad since I added those filters.

Has been working perfectly for me, for 3 months.

Have you verified that those filters aren't blocking any legitimate posts?

Who used in legit posts "Sponsored" or "Create ad".

Who used in legit posts "Sponsored" or "Create ad".

If you've been following this issue, you'll have seen the reports that Facebook has been inserting this sort of text into legitimate posts (but suppressing its display with CSS). I am asking whether this is still the case.

(btw, to test if it's blocking stuff, you can look at the logger)

The filter I posted above is a subset of :

www.facebook.com##div[id^=hyperfeed_story_id_]:has(span[data-ft="{\"tn\":\"j\"}"])
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Sponsored))
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Create ad))

I added an additional layer just to ensure legitimate posts are not affected. Also the second filter in that list does not work for me as a:has-text(Sponsored) has not matched any dom for me, since they moved the text to span.

Additionally if you would also like to block Suggested for You posts, this filter should do the trick :

www.facebook.com##div[id^=hyperfeed_story_id_] .userContentWrapper div:has-text(Suggested for You)

If you've been following this issue, you'll have seen the reports that Facebook has been inserting this sort of text into legitimate posts (but suppressing its display with CSS). I am asking whether this is still the case.

The 2 filters "sponsored" and "create ad" above are in the right hand sidebar. (pagelets).

Even if they had that text in legitimate posts, the filter wouldn't catch them because it's limited to the panels on the right hand side.

Screen Shot 2019-07-24 at 11 39 38 PM

Is there a way to block these Marketplace Stores ads?

try
facebook.com##[id^="pagelet_marketplace"]

When are these filters (https://github.com/uBlockOrigin/uAssets/issues/3367#issuecomment-480565210) for Facebook ads being committed to uAssets? Every week someone asks on the subreddit how to block facebook ads... Are we trying to find a solution that will work regardless of language?

I have tried to get filters submitted to uAssets and they say no go I don't know why I think you are better off going through one of the list and try to get it committed through that way

@llacb47 when someone submits them as a pull request

@ansul1001 that hasn't been my experience, whenever I submit a filter here it's gotten accepted. It's possible the filters you wrote were out of scope, but these definitely aren't.

I can understand if they keep changing, but the filters I have suggested have worked since 23 March, which is 5 months. So they should be stable enough to be included.

I'll submit a PR tonight and see how we go.

@psylenced

I've tried that span[data-ft='{"tn":"j"}'] before, and observed that over time FB go through cycles where that sometimes captures non-ad posts. Lots of them.

Other times it's fine.

So if your PR is accepted, expect future bugs of 'it's blocking all my posts', as these waves go by.

@psylenced

I've tried that span[data-ft='{"tn":"j"}'] before, and observed that over time FB go through cycles where that sometimes captures non-ad posts. Lots of them.

Other times it's fine.

So if your PR is accepted, expect future bugs of 'it's blocking all my posts', as these waves go by.

Can you post an example of reg post being blocked using the filter provided and a console screen shot

It was months ago; since then I haven't been filtering on that, since I already expected it to cause trouble.

So, just now I've turned that back on and -- so far, it's behaving well.

I still expect to see a wave of regular posts caught by it; like a pulse FB send down occasionally to fend ad blockers off from this datum. I'll monitor it for a while.

I can understand if they keep changing, but the filters I have suggested have worked since 23 March, which is 5 months. So they should be stable enough to be included.

I'll submit a PR tonight and see how we go.

did they accept your pull request

ok, added, let's see what happens

The :has-text filter may need to be tweaked for other languages.

if other languages has ads in .pagelet-group .pagelet.

The :has-text filter may need to be tweaked for other languages.

waiting suggestions, real examples, screenshots

I just tested Spanish.

https://i.imgur.com/YRDvwhP.jpg

Add Publicidad and Crear un anuncio

Publicidad = sponsored?

I assume it will be two new strings for almost every language, so:

Either regional strings/filters can be added in regional filters,

or maybe there is a DOM solution.

Publicidad = sponsored?

Pulicidad = advertising

@ansul1001 so where put as regex:

##.pagelet-group .pagelet:has(a:has-text(/Sponsored|Pulicidad/))

or

##.pagelet-group .pagelet:has(a:has-text(/Create ad|Crear un anuncio|Pulicidad/))

Publicidad not Pulicidad

@ansul1001 so where put as regex:

##.pagelet-group .pagelet:has(a:has-text(/Sponsored|Pulicidad/))

or

##.pagelet-group .pagelet:has(a:has-text(/Create ad|Crear un anuncio|Pulicidad/))

is the advertisement showing up on the right pagelet or the main hyperfeed if on the right
`
www.facebook.com##.pagelet-group .pagelet:has(a:has-text(Publicidad))

should work

Facebook devs watching this issue confirmed?

Also, existing filter might have false positives...

This works: www.facebook.com##div[id^=hyperfeed_story_id_]:has(._3c21):has(.fbEmuTracking) (probably not for long)

Facebook devs watching this issue confirmed?

No, 'tn:j' was first mentioned here on March 22, 5 months ago. No response.

'tn:j' was added to live easylist. FB stopped using it within 8 hours.

They're looking at actual list, not all related discussion.

Meanwhile, I have 17 ads in a News Feed tab at the moment; zero instances of class 'fbEmuTracking'.

Hmm. Now it stopped working....
Never mind.

Here's the DOM:

<div data-fte="1" data-ftr="1" class="_5jmm _5pat _3lb4 w_1g6flx89sv" id="hyperfeed_story_id_5d5df3df58f833765652873" data-testid="fbfeed_story" data-cursor="MTU2NjQzODM2NjoxNTY2NDM4MzY2OjI6NTYzNTgwODE5NjA2NDQyMDUwODowOjY3Mjc4MDE1NTM2ODAyMDM2NDY=" data-dedupekey="5635808196064420508" data-timestamp="1566072569" data-referrer="hyperfeed_story_id_5d5df3df58f833765652873" aria-posinset="2" aria-setsize="7" role="article" aria-labelledby="js_6" aria-describedby="js_7" data-insertion-position="1"><div class="_4-u2 mbm _4mrt _5v3q _7cqq _4-u8" id="u_ps_0_0_b"><div class="_3ccb" data-ft="{&quot;tn&quot;:&quot;-R&quot;}" data-gt="{&quot;type&quot;:&quot;click2canvas&quot;,&quot;fbsource&quot;:703,&quot;ref&quot;:&quot;nf_generic&quot;}" id="u_ps_0_0_c"><div></div><div class="_5pcr userContentWrapper" style="" data-ft="{&quot;tn&quot;:&quot;-R&quot;}"><div class="_1dwg _1w_m _q7o"><div class="_4r_y" id="u_ps_0_0_f"><div class="_6a uiPopover _5pbi _cmw _b1e _1wbl" id="u_ps_0_0_g" data-ft="{&quot;tn&quot;:&quot;V&quot;}"><a aria-label="Opciones de la historia" data-testid="post_chevron_button" class="_4xev _p" aria-haspopup="true" aria-expanded="false" rel="toggle" href="#" role="button" id="u_ps_0_0_l"></a></div></div><div><div class="k_1g6flx3ann l_1g6flx6iso clearfix"><div class="clearfix l_1g6flx38xa"><a target="" class="_5pb8 m_1g6flx6isv _8o _8s lfloat _ohe" aria-hidden="true" tabindex="-1" data-ft="{&quot;tn&quot;:&quot;\u003C&quot;}" href="https://www.facebook.com/TheIntivaHealth/?ref=nf&amp;__tn__=%3C-R&amp;eid=ARAAEMvHJOO8bGTC0s2gtXCz1Ug2DGbENRLKLo-zcVfLYrVO7JP8HaCDANDrpj41I8z14uJD-pxk4xkKKIxr6qf69xIQJ58zV3tKDFEgtaF8jGfvswhm9EL9NTpISFEgQY9YnGSqoEs0ic7AOQnywqxGgXSZLBlulmICBwrvfYIwgnIrrw&amp;hc_ref=ARQOPUfK52uKWNkoeQFXUIzhnHkaol_Z9xQEu09URCbT_heHMr09WdFc4AV4vFyx7vU&amp;__xts__%5B0%5D=68.ARAkmrnWQxhjiGdm9ouqKckYtli2E35vQyEuVupVJqvGuuvlpU72GG1JUPbhR2rwkFbtfd2nn0G908lR6ZDAxPmhQYY_kS-W2VJLntb8hfeKzkoJoLSMcagL-sZv159uReK5YL3F9RNQqv1BpMlBw4n-kKwC8ZDbfo7YBq2lkp6LojJRbSqtbaAyk_Zr6tIQN71jqyUTvoHhv3F6vzMI62fnqxZiDX4fB9F5jT4SW0hTLKDAFJoPWLjXWBVh5OS72g1eIhHYCPzsjw6n3Il4v7G3dHK4fltVZ_2X" data-hovercard="/ajax/hovercard/page.php?id=2140220522864664&amp;extragetparams=%7B%22__tn__%22%3A%22%2Cd%5Cu003C-R-R%22%2C%22eid%22%3A%22ARAAEMvHJOO8bGTC0s2gtXCz1Ug2DGbENRLKLo-zcVfLYrVO7JP8HaCDANDrpj41I8z14uJD-pxk4xkKKIxr6qf69xIQJ58zV3tKDFEgtaF8jGfvswhm9EL9NTpISFEgQY9YnGSqoEs0ic7AOQnywqxGgXSZLBlulmICBwrvfYIwgnIrrw%22%2C%22hc_ref%22%3A%22ARQOPUfK52uKWNkoeQFXUIzhnHkaol_Z9xQEu09URCbT_heHMr09WdFc4AV4vFyx7vU%22%7D" data-hovercard-prefer-more-content-show="1" data-hovercard-referer="ARQOPUfK52uKWNkoeQFXUIzhnHkaol_Z9xQEu09URCbT_heHMr09WdFc4AV4vFyx7vU"><div class="_38vo"><!-- react-mount-point-unstable --><div><img class="_s0 _4ooo _5xib _5sq7 _44ma _rw img" src="https://scontent.fatl1-1.fna.fbcdn.net/v/t1.0-1/p50x50/55476667_2451926741694039_2728016007825195008_n.png?_nc_cat=111&amp;_nc_oc=AQm54wBUeFZDvf4FXoFu9YxqtfzNvlEHvzvXBkreKJ-dYKBqCrh3R4C4ZOe0mTqSwPE&amp;_nc_ht=scontent.fatl1-1.fna&amp;oh=20a5bd671f0460d230df5e510d85616a&amp;oe=5DD50EDF" alt="" aria-label="Intiva Health" role="img"></div></div></a><div class="clearfix _42ef"><div class="rfloat _ohf"></div><div class="m_1g6flx38xh"><div><div class="_6a _5u5j"><div class="_6a _6b" style="height:40px"></div><div class="_6a _5u5j _6b"><h5 class="_7tae _14f3 _14f5 _5pbw _5vra" data-ft="{&quot;tn&quot;:&quot;C&quot;}" id="js_6"><span class="fwn fcg"><span class="fwb fcg" data-ft="{&quot;tn&quot;:&quot;k&quot;}"><a href="https://www.facebook.com/TheIntivaHealth/?__tn__=kC-R&amp;eid=ARDHYFsOUL4EczvdMoOOMFpBU1-smlErmjlbSm19qD_SkFJieacR8voddLO-8NgCJ2YHtG2fAaWW-cg2VJrZsRGqkhTPOB_-yUf77IXAx7vrAsDVrMnSp53U1Zlr_hro4ceR0lDHkw1jBOap9Biv_rgJwRpsxnrz-J-uEvKD05qGNZdPHQ&amp;hc_ref=ARSuHoy3DVzx7CKzQPUOwUrB4Ma-f1xt2iHCl1clG7i2-8yOwPr-wJ5ed5_6JKvdz1k&amp;fref=nf&amp;__xts__%5B0%5D=68.ARAkmrnWQxhjiGdm9ouqKckYtli2E35vQyEuVupVJqvGuuvlpU72GG1JUPbhR2rwkFbtfd2nn0G908lR6ZDAxPmhQYY_kS-W2VJLntb8hfeKzkoJoLSMcagL-sZv159uReK5YL3F9RNQqv1BpMlBw4n-kKwC8ZDbfo7YBq2lkp6LojJRbSqtbaAyk_Zr6tIQN71jqyUTvoHhv3F6vzMI62fnqxZiDX4fB9F5jT4SW0hTLKDAFJoPWLjXWBVh5OS72g1eIhHYCPzsjw6n3Il4v7G3dHK4fltVZ_2X" data-hovercard="/ajax/hovercard/page.php?id=2140220522864664&amp;extragetparams=%7B%22__tn__%22%3A%22%2CdkC-R-R%22%2C%22eid%22%3A%22ARDHYFsOUL4EczvdMoOOMFpBU1-smlErmjlbSm19qD_SkFJieacR8voddLO-8NgCJ2YHtG2fAaWW-cg2VJrZsRGqkhTPOB_-yUf77IXAx7vrAsDVrMnSp53U1Zlr_hro4ceR0lDHkw1jBOap9Biv_rgJwRpsxnrz-J-uEvKD05qGNZdPHQ%22%2C%22hc_ref%22%3A%22ARSuHoy3DVzx7CKzQPUOwUrB4Ma-f1xt2iHCl1clG7i2-8yOwPr-wJ5ed5_6JKvdz1k%22%2C%22fref%22%3A%22nf%22%7D" data-hovercard-prefer-more-content-show="1" data-hovercard-referer="ARSuHoy3DVzx7CKzQPUOwUrB4Ma-f1xt2iHCl1clG7i2-8yOwPr-wJ5ed5_6JKvdz1k">Intiva Health</a></span></span></h5><div class="_5pcp _5lel _2jyu _232_" id="feedsubtitle_263;2140220522864664;0;2565679040318808;1565638354:5635808196064420508:5:0:10422" data-testid="story-subtilte"><span class="v_1g6flx1ryk f_1g6flx31ej"><span class="fsm fwn fcg"><span class="e_1g6flx267y"><a class="g_1g6flx23be f_1g6flx23ap" href="#" role="button" id="u_ps_0_0_d"><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="S" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="P" class="k_1g6flx23bh j_1g6flx1le0 e_1g6flx23b2"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="t" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="S" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="t" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="u" class="k_1g6flx23bh j_1g6flx1le0 e_1g6flx23b2"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="b" class="k_1g6flx23bh j_1g6flx1le0 e_1g6flx23b2"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="l" class="k_1g6flx23bh j_1g6flx1le0 e_1g6flx23b2"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="p" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="i" class="k_1g6flx23bh j_1g6flx1le0 e_1g6flx23b2"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="n" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="c" class="k_1g6flx23bh j_1g6flx1le0 e_1g6flx23b2"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="r" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="s" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="i" class="k_1g6flx23bh j_1g6flx1le0 e_1g6flx23b2"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="e" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="d" class="k_1g6flx23bh j_1g6flx1le0 e_1g6flx23b2"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="r" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="n" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="a" class="k_1g6flx23bh j_1g6flx1le0 e_1g6flx23b2"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="o" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="n" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="d" class="k_1g6flx23bh j_1g6flx1le0 e_1g6flx23b2"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="s" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="o" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="o" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="r" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="e" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="s" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="d" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span><span class="k_1g6flx23bh g_1g6flx23aq n_1g6flx23a-"><span data-content="o" class="k_1g6flx23bh j_1g6flx1le0 y_1g6flx23b5"></span></span></span></a></span></span></span><span class="_6spk" role="presentation" aria-hidden="true"> · </span><a class="uiStreamPrivacy inlineBlock fbStreamPrivacy fbPrivacyAudienceIndicator _5pcq" aria-label="Público" href="#" role="button" data-hover="tooltip" data-tooltip-content="Público"><i class="lock img sp_xkmPxZzisR6 sx_d964cc"></i></a></div></div></div></div></div></div></div></div><div data-testid="post_message" class="_5pbx userContent _3576" data-ft="{&quot;tn&quot;:&quot;K&quot;}" id="js_7"><p>Free CEU For Nurses</p><p> Browse hundreds of CE courses for nurses on any device. Approved by ANCC. Earn &amp; track your credits in one convenient place.</p></div><div class="_3x-2" data-ft="{&quot;tn&quot;:&quot;H&quot;}"><div data-ft="{&quot;tn&quot;:&quot;H&quot;}"><div class="mtm"><div id="u_ps_0_0_e" class="_6m2 _1zpr clearfix _dcs _4_w4 _41u- _59ap _2bf7 _64lx _3eqz _20pq _3eqw _2rk1 _1-9r" data-ft="{&quot;tn&quot;:&quot;H&quot;}"><div class="clearfix _2r3x"><div class="lfloat _ohe"><span class="_3m6-"><div class="_6ks"><a href="https://intivahealth.com/register/free-ceu-ig/?utm_source=instagram&amp;utm_medium=instagram_ads&amp;utm_campaign=insta_ceu_nurses&amp;fbclid=IwAR3x_n2CZUnhQSfsC1g9ZIjixcLfkOQanQputbxRL5XscNkDrE4vDVnzwk0" tabindex="-1" target="_blank" rel="noopener nofollow" data-lynx-mode="async" data-lynx-uri="https://l.facebook.com/l.php?u=https%3A%2F%2Fintivahealth.com%2Fregister%2Ffree-ceu-ig%2F%3Futm_source%3Dinstagram%26utm_medium%3Dinstagram_ads%26utm_campaign%3Dinsta_ceu_nurses%26fbclid%3DIwAR3x_n2CZUnhQSfsC1g9ZIjixcLfkOQanQputbxRL5XscNkDrE4vDVnzwk0&amp;h=AT2M3HcbVwf7Q3ke_vTay58gIv6zF_UtQT359Qbu0NopMetZxcHHOCf24ONulxVYlT59hgnulvdSTIbukRZqKp7Xm4spXkJUrUJUS8evBGOaSxkGNYvAW90ZSm8pDTR9P2589PRC1TwNiuj6jJjmd5xfXjEIg0yC23-POpUQVIkfxaDeIGR-VrK7hZMQjobjLRkInL4xxzrDzalyT2Ujpgq5QyfMkucRpmXTLVjftUN7YKEBEv_LZf7jyVT2z2vVuhEWvgHKF2zE81JHSpmxsIxmAPkvsVlpptcb6XvCAXsyWjqLJSNn990xAKs1K58z7zMzMCMtIOuGpjAyCbPKaGeMQm4bZBMov5hKuO8Qe_1J7Zvdse2OYvslpwaiSMxS6S6nACddLPn2SrYOcnLnx9z_G4IY_K4rXGctkJfp_BYrS8quvxaMGxYq2QZMnxmwjzWiH1p2QPlNB5Fvsg6EspMPqe3GngbuaQW7Aln9zWYIko71lu2mZSn21b7ULB-6ftHF_7Q9kamPQ49XOgUdh4C8dmC0pEB5auEcN7UBaOLfOX7XUyQ"><div class="_6l- __c_"><div class="uiScaledImageContainer _6m5 fbStoryAttachmentImage" style="width:500px;height:500px;"><img class="scaledImageFitWidth img" src="https://scontent.fatl1-1.fna.fbcdn.net/v/t45.1600-4/cp0/q90/spS444/p180x540/62229729_23843429999370244_3368181467409547264_n.png.jpg?_nc_cat=102&amp;_nc_oc=AQng3WZzycAy7F8HERz6b4827YvGQzhH9uFK5WxNm7Dpech6f0ZYE9C7HngufomwKqw&amp;_nc_ht=scontent.fatl1-1.fna&amp;oh=8fc058b98cd4b0d6c7f2f38d19230c59&amp;oe=5E0C9467" data-src="https://scontent.fatl1-1.fna.fbcdn.net/v/t45.1600-4/cp0/q90/spS444/p180x540/62229729_23843429999370244_3368181467409547264_n.png.jpg?_nc_cat=102&amp;_nc_oc=AQng3WZzycAy7F8HERz6b4827YvGQzhH9uFK5WxNm7Dpech6f0ZYE9C7HngufomwKqw&amp;_nc_ht=scontent.fatl1-1.fna&amp;oh=8fc058b98cd4b0d6c7f2f38d19230c59&amp;oe=5E0C9467" alt="" width="500" height="500"></div></div></a></div><div class="_3ekx _29_4"><div class="v_1g6flx20ym"><div></div><div class="_6m3 _--6 k_1g6flx20pl"><div class="_59tj _2iau"><div><div class="_6lz _6mb _1t62 ellipsis">intivahealth.com</div><div class=""></div></div></div><div class="_3n1k"><div class="mbs _6m6 _2cnj _5s6c"><a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fintivahealth.com%2Fregister%2Ffree-ceu-ig%2F%3Futm_source%3Dinstagram%26utm_medium%3Dinstagram_ads%26utm_campaign%3Dinsta_ceu_nurses%26fbclid%3DIwAR3rVu2XwePCvyyveT2nGlogg9zhgTvr8wYASxZf5XxXmaqLbYNC_xb5GGE&amp;h=AT3-tG_rMkDhlNNT8g7oC_X2OkwBuqYCZJzNaAiWnbJ5lF6F9Z2L4jXORz_JmuMj9ZdxEPmNRrfjY3igj7FvNjOma_73jKJFtP2pb0LT5K2flKNgYsTTKTTMMqaUAPgoUZFFBiQVVWIlTACnXvUwdaq2z5GKSPPEjkb0xCb55MAU97vpgr0D7jvBY9oPxWRCMglMvUNM9bZcZyddW8LgldFWdAcUqQYX1KUtMA5C-zEqkk6pyvA1z8hiCY0TO9TLUfEerZneu0QwGV6woip2bT6vk-lMZOvWRMwXAdkGueh45W1O2Ae_d9y6CXQaYTXfRg2agcPIM2GceOMkOduEvdMNI7qQvW4ZGxoaJP4PUPAxx4lxFUFWb8J-ao97owCU9TeUZwTpICkP6w6DNfJAifPT-Hzb0E6cdG7A1dzjwXUM6C8V0DHn77dLBZRjdiM-cwiPESFJOnsT3xVmO4yy1mOkW8xLRs6bzuB20z77K1YppDQmWljCFU_J7tQ5aIaiihzuD9OExecufr0DFW_daGHBE06IPRnqiVy4hDcqn6SvQRM5ml4" rel="noopener nofollow" target="_blank" data-lynx-mode="async">Free CEU Courses For Nurses</a></div><div class="_6m7 _3bt9">ANCC Approved</div></div></div><div class="f_1g6flx1-29"><div class="v_1g6flx20r2"><div class="_6a" data-ft="{&quot;tn&quot;:&quot;*J&quot;}"><a class="u_1g6flx25bu b_1g6flx25bl i_1g6flx25bv o_1g6flx25bw" href="https://l.facebook.com/l.php?u=https%3A%2F%2Fintivahealth.com%2Fregister%2Ffree-ceu-ig%2F%3Futm_source%3Dinstagram%26utm_medium%3Dinstagram_ads%26utm_campaign%3Dinsta_ceu_nurses%26fbclid%3DIwAR36lmGyFPXIZlU2P8xe5Ya1sku2n8W-Ya5ZcLdgP_-fcScKJ_ALGfyzwIo&amp;h=AT0TjZ4kBWK2a00KuqlYWrqeBoYXNFu-6UEhAWgAm7Qp1WDyWPjm210bahLjQTBc_8RUq_AuRRACUqIMsr_wpOm9iSeRQsTAcvFTJ88eDPhB1RpNdZdRtQFYiSMivZRYXPDrW9irmceNxbwuqf_fgudPT96hZgaYD4xEsMdErbwdyj-0LB-D-NLhmvwUnyFZGi7LquKP2hBlhrgULy15Fj3c0PmUI7QdYQarXVeRV_F0blDsYDvtcQxixQLBfL4gBTWf5PSBNmbhYM1o94xofxcZMQY94joNszolTXfX-wzdS7YBOIBNfAswvRAhEXkZgR8wrae9fv_KXSDIKl1Cxv--tSiSxi_j0PD-cpdsZyU7Gn8g2fPdY35i6gLn_vu9vI4GsjVnbWRuqwcr2VXZiNMdeWu2rKZSkKCLudQDPA778-i_6hjx8sXwnLLZlGlUZJutXZWgT96jqDMSxhWdefM4CDhEtnHUuFrHhVL7cBeM0xshZTQ200GEkUianIdPjuvQRL_m9T-A62eKI0drHc5IJF67PQ8OKDJciSkhusgIvUzOQ7AwMShh" target="_blank" rel="noopener nofollow" data-lynx-mode="async">Más información</a></div></div></div></div><a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fintivahealth.com%2Fregister%2Ffree-ceu-ig%2F%3Futm_source%3Dinstagram%26utm_medium%3Dinstagram_ads%26utm_campaign%3Dinsta_ceu_nurses%26fbclid%3DIwAR0MEalfgu8H0z2yIUIpQChvdqBsO7HhTEjkjXI0kc9UGXepqJJBur7d8BY&amp;h=AT0dAYShzmgaVsyZlwN12K1aukodx4CAHbSAyZ1Kc7nJaJm9pfqwRKw6yBS6mZ8anZ8Y4Pd_smjRYQbkX-1_3OApygatevxERZfxym9FfbpALV1qAYvJ98qqKnZcb7cWcRdEMU6btn5DtfX0zxia8wQcBTXQnRBh7B53xXhZnDJS037V8qCE7N2t1HVTJAEFwDkDaWHH6XIFpbZzek2bcC_t8qcKA1HL5hST8KrbhFfjSrZbH86LFklxhQJbVduU7o1Vz7ohDjPcKR8_xsBgcv4139CeQSFM6PJm8_63AwXamC4uZELxVtpEp86420fGBnlYqnw54UDnRruf8fqS0BePx0CDXXuOARbMmjkITD_RXpWUI3D0cAv-_aoahN1zNnCHPBbwbNGneGbbSxd1mY21fbGvXh72dGZqdXX1KSK69s0XrADpQ00ygj0X9QYRJMlADv_1Cbz-xumiByiTVdEiD2cDCy30fMh7q1gQQLdjkOpDsVVGTw3mGNfxU359pMLfWX-kvLMXZ80U7c4TFKOA952rEvInNFkUlp33Uwe14YnLb7Y9UEWcNKF1Vw" rel="noopener nofollow" tabindex="-1" target="_blank" class="_52c6" data-lynx-mode="async"></a></div></span></div><div class="_42ef"><span class="_3c21"></span></div></div></div></div></div></div><div></div></div></div><div><form rel="async" class="commentable_item collapsed_comments" method="post" data-ft="{&quot;tn&quot;:&quot;]&quot;}" action="/ajax/ufi/modify.php" onsubmit="" id="u_ps_0_0_n"><input type="hidden" name="jazoest" value="21986" autocomplete="off"><input type="hidden" name="fb_dtsg" value="AQHYiw2NsHJP:AQEEGVMWBMbR" autocomplete="off"><input type="hidden" autocomplete="off" name="ft_ent_identifier" value="2565679040318808"><input type="hidden" autocomplete="off" name="data_only_response" value="1"><div class="_4299"><div class="_5vsi"></div><div><div class="_78bu"><div class="_68wo" data-testid="fbFeedStoryUFI/feedbackSummary"><div class="_3vum"><div class="_66lg"><span aria-label="Consulta quién reaccionó a esto" class="_1n9r _66lh" role="toolbar"><span class="_1n9k" data-testid="UFI2TopReactions/tooltip_LIKE" tabindex="-1" data-hover="tooltip"><a ajaxify="/ufi/reaction/profile/dialog/?ft_ent_identifier=ZmVlZGJhY2s6MjU2NTY3OTA0MDMxODgwOA%3D%3D&amp;reaction_type=1&amp;av=100029808647212" href="/ufi/reaction/profile/browser/?ft_ent_identifier=ZmVlZGJhY2s6MjU2NTY3OTA0MDMxODgwOA%3D%3D&amp;av=100029808647212" rel="dialog" aria-label="7 Me gusta" class="_1n9l" tabindex="0" role="button"><span class="_9zc _19kl _1n9q"><i class="_3j7l _2p78 _19kl"></i></span></a></span><span class="_1n9k" data-testid="UFI2TopReactions/tooltip_LOVE" tabindex="-1" data-hover="tooltip"><a ajaxify="/ufi/reaction/profile/dialog/?ft_ent_identifier=ZmVlZGJhY2s6MjU2NTY3OTA0MDMxODgwOA%3D%3D&amp;reaction_type=2&amp;av=100029808647212" href="/ufi/reaction/profile/browser/?ft_ent_identifier=ZmVlZGJhY2s6MjU2NTY3OTA0MDMxODgwOA%3D%3D&amp;av=100029808647212" rel="dialog" aria-label="3 Me encanta" class="_1n9l" tabindex="-1" role="button"><span class="_9zc _19kl _1n9q"><i class="_3j7m _2p78 _19kl"></i></span></a></span></span><a ajaxify="/ufi/reaction/profile/dialog/?ft_ent_identifier=ZmVlZGJhY2s6MjU2NTY3OTA0MDMxODgwOA%3D%3D&amp;av=100029808647212" href="/ufi/reaction/profile/browser/?ft_ent_identifier=ZmVlZGJhY2s6MjU2NTY3OTA0MDMxODgwOA%3D%3D&amp;av=100029808647212" rel="dialog" class="_3dlf" data-testid="UFI2ReactionsCount/root" tabindex="0" role="button"><span aria-hidden="true" class="_3dlg"><span class="_3dlh" data-hover="tooltip"><span class="_81hb">10</span></span></span><span class="_3dlh _3dli" data-testid="UFI2ReactionsCount/sentenceWithSocialContext"><span data-hover="tooltip"><span class="_81hb">10</span></span></span></a></div><div class="_1r48"></div><div class="_4vn1"><span class="_355t _4vn2" data-hover="tooltip"><a ajaxify="/ajax/shares/view?target_fbid=2565679040318808&amp;av=100029808647212" class="_3rwx _42ft" data-testid="UFI2SharesCount/root" href="/shares/view/?av=100029808647212" rel="dialog">9 veces compartido</a></span></div></div></div><div class="_1dnh"><div class="_3vuz"><span class="_18vi"><div class="_666k" data-testid="UFI2ReactionLink/actionLink"><div class="_8c74"><a aria-pressed="false" class=" _6a-y _3l2t  _18vj" data-testid="UFI2ReactionLink" href="#" role="button" tabindex="0"><i class="_6rk2 img sp_DOVwx90K0FX sx_21efd4" alt=""></i>Me gusta</a><button class="accessible_elem" tabindex="-1" type="button">Mostrar más reacciones</button></div></div></span><span class="_18vi"><a class=" _666h  _18vj _18vk _42ft" role="button" tabindex="0" testid="UFI2CommentLink" title="Dejar un comentario" href="#">Comentar</a></span><span class="_18vi"><span class="_1j6m"><a class=" _2nj7  _18vj _18vk" data-ft="{ &quot;tn&quot;: &quot;J&quot;, &quot;type&quot;: 25 }" href="#" role="button" tabindex="0" title="Enviar esto a tus amigos o publicarlo en tu biografía">Compartir</a></span></span></div></div></div></div><!-- react-mount-point-unstable --></div></form></div></div></div></div><div></div><iframe src="/xti.php?xt=AZUiDdYskQmhnyruVAcSJujzyXXXDCFNS9B6Td7rJZSFkIqzScyxHEXK58FQ7hTHh99u_83iscug36HoXa-DE7OuZG69o_iRTbvuk9zwJynwE3aVmnHdDRN1nQkBycoU004IUA1mSRs-gPwcx0B8GYnCjMQ5ABpwC3IlLgDX8LpwX6cl8kfPUMK2Bdykfe0NE6yg_K3-v82J7WMGQH95rl3DU_irTub2bDWd8kYw5dhdUaJAulkEoHUyhElrESW-LSTWN6-2FM7upU-0expCn-S95v-XkQXIrleHShhD5JkAP56rrFl_ejgiWXYN-D0iz8CsQ1UcA2SAdwcSjXosumu00jai-AIVMX49hCMtQqnHS41R9lEGEPjTID1GKluX55aY6NLBXqkaF4-YaJzDgoJ69xciaT95Uw7TcahiKbCdllRPC72ygt3rK2POuoKKWPWWZ174nfyKxSCryhicAXy7UVwZNHC9hq3SacjoHzyFX2OQLM57scI_4C1EPfm5UPzxaNkzP-SwCbjw6JiHcmkJSmkxctsSK_DF-jF2du_IzXMzTXQ9-dg09kay5awzIdR-lAmzRGECfSJc9_9_5VXMExKYYpxFYu0H21zByvBP5nKv-kG5u97QInNpBiIDBgG-sqkOZYyii7lZiVr6ocWZ3j2GvF7TIUQ6wPXcqHdKQalDNW6Duu12O4tKo4rgUZYf5-_3Ai_4fGZmgPA52yK8y45LetM4tng_cHBHSgMwvWy5LsugepscAWSTK78srDXEHl4UA_qOmokqIXAd_Nagqze7kTLvSGCosA-O1o84EeXvYOatoazPABol4NlaBMa9KKckcsqKMLZkqdSyD2_vLEw-3TsZjPki9jd4NhVkg26WH2xyA3Cob-otZLW7KdB5Kim4a174yq-RBgq1ailnHHB7Nr9XCOb-5DkeKZF-0ORWBdt0BGH6hFFhsdNskgyFUKBzeuG2OZqyJushBEAQc9DOdZZQtR2glxMTpj1WQwpVqXxk9TNn9UYacF82cCW7604n6Zw7WIhdruR_lVXN0k1yfRgMu9LgraN0uhr-dzWmX2y0n7q9ypRMpLMHiLqa7Cms6h-Icmi4jKfNn3E3LgvTWZzPK5c8FG0JTYqF8ndmVLBjRJY7aR6LCVXnqU52xeQsdSrVvneNcn9PWyBK&amp;isv=1&amp;cts=1566438378&amp;csp=2&amp;hba=false&amp;etid=1566438378757_2758993276&amp;sender=ViewableImpressionTracker&amp;me=%2Fhome.php%3Atopnews&amp;transmission_channel=iframe" scrolling="no" class="fbEmuTracking" aria-hidden="true" style="display: none !important;" width="0" hidden="" height="0" frameborder="0"></iframe></div>

image

Here's another filter to test from @ansul1001 on reddit:

facebook.com##div[id^=hyperfeed_story_id_]:has(a[role^=button]:has(> span:has([data-content]):not(:has([data-content="1"])):not(:has([data-content="2"])):not(:has([data-content="3"])):not(:has([data-content="4"])):not(:has([data-content="5"])):not(:has([data-content="6"])):not(:has([data-content="7"])):not(:has([data-content="8"])):not(:has([data-content="9"])):not(:has([data-content="w"])))) - Works for me

Yeah I made that and it is still working I hope that the Facebok dev don't see it

Yeah I made that and it is still working I hope that the Facebok dev don't see it

Only a matter of time, the real solution we need is :has-visible-text, but I'm unsure of how difficult that would be to implement (probably very).

There's this alternative client for Facebook (Android) that doesn't display ads/sponsored posts. It's a web wrapper for the facebook site. I think its blocking method might be implemented somehow in a ublock filter/userscript

I don't know, I'm on Firefox.

This appears to be how the alternative client @DanielValahul mentioned hides ads:

https://github.com/AllanWang/Frost-for-Facebook/blob/dev/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssHider.kt#L35

Can someone test this filter: facebook.com##div[id^=hyperfeed_story_id_]:has(a[role^=button]):has(iframe[src*="xti"])

uBo reject " for exceptions?

#@#div[id^=hyperfeed_story_id_]:has(a[role^=button]):has(iframe[src*="xti"])
#@#div[id^=hyperfeed_story_id_]:has(a[role^=button]):has(iframe[src*=xti])

It worked fine for me, I don't think so

I tested and no simplify:

obraz

uBo reject " for exceptions?

#@#div[id^=hyperfeed_story_id_]:has(a[role^=button]):has(iframe[src*="xti"])
#@#div[id^=hyperfeed_story_id_]:has(a[role^=button]):has(iframe[src*=xti])

Oh, for exceptions. Never mind

Can someone test this filter: facebook.com##div[id^=hyperfeed_story_id_]:has(a[role^=button]):has(iframe[src*="xti"])

Doesn't work. Does it depend on Facebook's language?

Maybe... I'm testing it in Spanish, and Facebook injects two iframes into every ad for tracking.

Hmmm, seems to delete them, but not immediately. On one account there's none of them no matter how much I scroll, whereas on the other one they dissapear after a second or 2

Yeah, I have similar behavior. The newsfeed will refresh itself a few times after loading Facebook and then cosmetic filters have some delay before kicking in. I think that might be a uBo bug (?) or some DOM trickery Facebook does to delay uBo applying the cosmetic filter.

Or slowdown by "milion" :has() and :not(:has()).

ADS

Capturar_2019_10_13_17_58_27_84
Capturar_2019_10_13_18_01_01_833

Out of topic question, did anyone get new layout (v5) yet?

How can you tell?

4dad9b71880663151eafe686b847e213

* obtain from https://www.blognone.com/node/109514 (Thai tech news)

Nope still I have blue (not white).

Try this
facebook.com##div[id^=hyperfeed_story_id_]:has(div:has-text(Más información))

Imo no compatible with Portugal / Spain version FB.

new template arrived today as optional beta (germany)

Having problems once again with facebook sponsored posts.

I noticed that facebook changed the css class on the subtitles again. Here are the filters I'm currently using for english:

facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^=feed_subtitle_]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d/))
facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^=feedsubtitle_]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d/))
facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^=feedlabel_]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d/))

Thanks singron

For french i modify a little bit the filter and i am using this one that currently works well :

facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^=fbfeed_sub__header_]:has-text(/S.*p.*o.*n.*s.*o.*r.*i.*s.*é/))

Despite multiple issues to fix Bing Ads, there has been no response whatsoever and agitation from repo maintainers:
So, referencing my issue here:
https://github.com/uBlockOrigin/uAssets/issues/6887#issuecomment-578509029

Let's name and shame ublock origin until their ego issues get resolved.

I don't have the id fbfeed_sub__header_ anymore.

Here is the one currently working for me for French: facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^=fbfeed_sub_header_id_]:has-text(/S.*p.*o.*n.*s.*o.*r.*i.*s.*é/))

Have been using this pattern for a while to block out sponsored posts :

www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="fb-testid-feed-subtilte"]:has(span:has(span:has(span:has(a:has(span))))))

So far so good.

:has(span:has(span:has(span:has(a:has(span))))))

maybe simplify:

:has(span span span a:has(span))

My Facebook started using the following HTML code to show the letters of Sponsored, 16 hrs, etc:

<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7">
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="t" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="S" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="p" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="a" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="1" class="q_9jr4kntbo y_9jr4kogwp r_9jr4kntbr"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="6" class="q_9jr4kntbo y_9jr4kogwp r_9jr4kntbr"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="d" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="c" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="o" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="&nbsp;" class="q_9jr4kntbo y_9jr4kogwp r_9jr4kntbr"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="h" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="n" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="s" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="o" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="h" class="q_9jr4kntbo y_9jr4kogwp r_9jr4kntbr"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="r" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="i" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="d" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="a" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="r" class="q_9jr4kntbo y_9jr4kogwp r_9jr4kntbr"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="s" class="q_9jr4kntbo y_9jr4kogwp r_9jr4kntbr"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="e" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
<span class="q_9jr4kntbo h_9jr4kntbd p_9jr4kntb7"><span data-content="d" class="q_9jr4kntbo y_9jr4kogwp t_9jr4kntbs"></span></span>
</span>

This HTML corresponds to a visible output of 16 hrs (it's not a sponsored post, even though all the letters of Sponsored are present). The relevant corresponding CSS looks like

.t_9jr4kntbs {
 display:none
}
.r_9jr4kntbr {
 position:relative
}
.y_9jr4kogwp::after {
 content:attr(data-content)
}
.y_9jr4kogwp::before {
 content:var(--node-value)
}

Unfortunately the use of data-content with the :after{content} CSS appears to render the text invisible to has-text, so we have to look at the CSS properties directly. Luckily uBO added matches-css, so we can do something like this:

facebook.com##div[role^=article]:has(div[id^=feedlabel_] span:matches-css(display:inline)[data-content^=S])

This is not a complete solution yet because it would block posts containing Saturday, for example. A better, more general solution would allow us to inspect the matches of matches-css sequentially, to check for S, p, o, n, ... Maybe some kind of nth operator on the matches-css result? Someone with more CSS-fu than me might know.

Something like this works completely (on my feed at least - probably needs to be combined with other solutions here for a complete filter) because sponsored posts never have numbers in the distractor letters, but regular posts (apparently) always do:

facebook.com##div[id^=hyperfeed_story_id_]:has(div[id^=feedlabel_] span:matches-css(display:inline)[data-content^=S]):not(:has(div[id^=feedlabel_] span:matches-css(display:inline)[data-content^='0'],[data-content^='1'],[data-content^='2'],[data-content^='3'],[data-content^='4'],[data-content^='5'],[data-content^='6'],[data-content^='7'],[data-content^='8'],[data-content^='9']))

It's fragile though so it's not something that would work long-term. FB is using different anti-adblock techniques for different users, so YMMV. However, hopefully what I've posted here is more of a general bypass of one (nasty) technique rather than something that is precisely specific to my feed.


Other options: maybe has-text could be augmented to include CSS content and ignore display:none? It sounds potentially expensive, so maybe it would go under a new has-visible-text selector or something like that for special cases like this.

Adguard on Facebook kill this with scriplet, maybe is time convert own solution to userscript?

I've noticed the id for fbfeed_sub_header_id_ has a different amount of underscores for every user here. So I used data-testid="fb-testid-feedsub-title" like @l-easwar-akiyama.

There is a difference however, as I have feedsub-title and l-easwar-akiyama uses feed-subtilte, so maybe FB is messing with that title as well.

My working filter for dutch is now: facebook.com##div[id^="hyperfeed_story_id_"]:has(div[data-testid="fb-testid-feedsub-title"]:has-text(/G.*e.*s.*p.*o.*n.*s.*o.*r.*d/))

I noticed this does slow down FB on initial pageload. I'm guessing this is since FB directly has to load more posts as there is no more ad to fill the page until the fold...

www.facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^="fbfeed_sub_header__id_"]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d/))

works as of now.

@Zombaya your rule assumes

<div class="_5pcp _5lel _2jyu _232_" id="fbfeed_sub_header__id_*" data-testid="fb-test-id-feed-sub-tilte"></div>

which has a typo in title.
also it's good to stay away from test features.

It'd be good if you added some .* in between fbfeed_sub_header__id.

If you scroll through your feed and come across a video and let it play, the video will disappear after some time before finishing. There was nothing in the logs but disabling uBlock fixes the issue.

! 3/15/2020, 7:31:51 PM https://www.facebook.com/
www.facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^="fbfeed_sub_header__id_"]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d/))

! 3/15/2020, 7:42:46 PM https://www.facebook.com/
www.facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^="fbfeed_sub_header__id_"]:has-text(/IamFunny/))

This works fine for me. Change the words according to the word FB displays. @gbisheraz581m

Did you apply changes ?

! 3/15/2020, 7:31:51 PM https://www.facebook.com/
www.facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^="fbfeed_sub_header__id_"]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d/))

! 3/15/2020, 7:42:46 PM https://www.facebook.com/
www.facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^="fbfeed_sub_header__id_"]:has-text(/IamFunny/))

This works fine for me. Change the words according to the word FB displays. @gbisheraz581m

Doesn't work for me either unfortunately.

@aAmahQpwRk you need to do it yourself, based on what Facebook uses in your region. Like in https://github.com/uBlockOrigin/uAssets/issues/3367#issuecomment-568143390, we see that slight changes in underscores (_) is all is required. So you should find a sponsored post, inspect element, and scan the HTML/CSS for similar words and replace them in the filter I posted above.

What you can also do is keep hovering in the code till only the sponsored post is highlighted, not any other post above or below it. Then copy that specific portion on pastebin etc and share the link. If you feel there's something to redact, do so.

Any idea why

facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^="fbfeed_s_header_id_"]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d/))

is 'destroying' my timeline? It keeps refreshing over and over again. I also tried

www.facebook.com##div[id^=hyperfeed_story_id_]:has(div[data-testid="fb-testid-feed-subtilte"]:has(span:has(span:has(span:has(a:has(span))))))

with different variants of fb-testid-feed-subtilte or hyperfeed_story_id_, but my timeline goes crazy, the ads disappear and load again and again, basically my screen is flickering.

Hide too much and FB scripts have 💥 "🤯"?

@popadi that is the updated filter I'm using too, it changed some days ago. Cannot redo such error. You can try disabling other extensions & rules (that there might be for FB).

www.facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^="fbfeed_s_header_id_"]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d.* | O.*M.*G.* | I.*a.*m.*F.*u.*n.*n.*y.* | F.*U.*N.* /))

this works awesome for me.

@popadi that is the updated filter I'm using too, it changed some days ago. Cannot redo such error. You can try disabling other extensions & rules (that there might be for FB).

www.facebook.com##div[id^="hyperfeed_story_id_"]:has(div[id^="fbfeed_s_header_id_"]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d.* | O.*M.*G.* | I.*a.*m.*F.*u.*n.*n.*y.* | F.*U.*N.* /))

this works awesome for me.

@anktkr Just tried it, my timeline is mad with this too. I only use uBlock (no AdBlock). It seems facebook is reloading the ads or something like this. I already hate it.

@popadi type that into the element picker mode's box and do a preview. It shouldn't capture normal posts. Can't think of anything that can stop the site reloading the posts.

I use uBlock with zero other customisations. You can try this:
back up the extension, load factory settings, add this single filter and open FB. hope it works then & you can single out the cause.

@popadi I'm using this https://github.com/el1t/uBlock-Safari/releases/tag/1.16.0 on Safari Version 12.1.2

Maybe too old bugged fork?

Alternative:

  • AdGuard addon 1.7 (free) - if support AdGuard scripts/scriplets / css (rather weak) / procedural filtering (extendCSS)

  • AdGuard app - 2.5.X (paid) - should support load any custom script with property configuration - AdGuard hide selfpromotion with script instead of procedural filtering (extendCSS).

  • abandoning Safari for Firefox / Chrome / Opera (as you don't must to use 12 hours your macbook on a single charge)

@krystian3w I'm happy with it, as of now. Will revisit this thread after I upgrade to Catalina (I'm using extension builder right now, which has been dropped in Safari 13.).

@popadi I'm using this https://github.com/el1t/uBlock-Safari/releases/tag/1.16.0 on Safari Version 12.1.2

@anktkr I'm using 1.24.4 on Chrome 80.0.3987.163. If I go to the developer tools in the network tab and hit refresh after activating the filter, it goes crazy. It makes about 700+ requests and my timeline flickers for about 15-20 seconds, like it's being filtered real time, lol. Then the scrolling is not very smooth, it randomly jumps, because facebook keeps bringing back to life ads and uBlock tries to kill them. Oof

ezgif-1-14a1a3e9ae52

(1) the filter expressions mentioned here recently are ultra-terrible

(2) if your FB news feed is going nuts like that, turn off all ad blockers and look at what it looks like in 'normal space'. FB sometimes purely goes nuts. If they're jamming a continuous stream of nothing but ads down the pipe, that's what it's going to look like -- ad blocker continuously destroying them and nothing else becoming visible. In that case it isn't the ad blocker's fault, just FB having one of its typical brain haemorrhages

[*]?

https://github.com/uBlockOrigin/uAssets/issues/3367#issuecomment-586451776
@nneonneo so this layout has been rolled out in other countries too & is likely to become the default.

I think that a combination of data-pagelet="FeedUnit_ (the highest level box for a feed item) and href=/ads/about/?_ (the link under the word sponsored) can be used for a filter.

The following works only after you hover on the word Sponsored since that's when the link is generated(?) But that defeats the purpose of an adblock. If someone else can make it work, please let us know.

www.facebook.com##[data-pagelet^="FeedUnit_"]:has([href^="/ads/about/"])

The following works nicely. It Also blocks the two ad panels in the right sidebar.
It's a modified version of the one I had mentioned at https://github.com/uBlockOrigin/uAssets/issues/3367#issuecomment-612970458, so if that didn't work for you, good luck.

www.facebook.com##[data-pagelet^="FeedUnit_"]:has-text(/S.*p.*o.*n.*s.*o.*r.*e.*d.*/)

I'm using Safari and ublock-origin-safari.

ublock origin safari is not supported anymore, @anktkr.

@llacb47 I didn't update to safari 13. So, even if it is outdated for people on chrome or mozilla, it works for me. I don't know how much has the syntax changed for the current release for ubo, but the crucial bit is there in my comment.

And so it will probably fall because they change the name of the attribute (data-pagelet) or its value (FeedUnit_) in the feature.

what filter to block the ads on the right on the new fb design?

EasyList use strange filter:

https://github.com/easylist/easylist/blob/bd25d9a51944fa49c47ec6ccf4f2a219fe47aa40/easylist/easylist_specific_hide.txt#L375

hide "sponsored" text after hover and And you will no longer know if the post was sponsored.

this filter should probably be removed as it's not helping in any way, the ads link is only generated on hover, and it only hide the link, not the ads

So what is the point?

On Mon, 15 Jun 2020 at 10:27, momala454 notifications@github.com wrote:

this filter should probably be removed as it's not helping in any way


You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/uBlockOrigin/uAssets/issues/3367#issuecomment-644014754,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AGEAT3E2WUI5FUUWXJTSU5TRWXSRDANCNFSM4FSO62AA
.

EL has long been blocking tiny "AD" icons to indicate they're ads, probably under an assumption the ads' body is blocked by other filters, which is not always true.

URL(s) where the issue occurs
https://www.facebook.com/groups/UtahGayForum/insights/?__fns&hash=Ac3c-ALO7WkO67TM

Describe the issue
Group Insights for admin being blocked.

Versions
Browser/version: [Chrome 84.0.4147.89]
uBlock Origin version: [1.27.10]
FACEBOOK CLASSIC
Settings
[Default]

**Was working within the past week.

Tried flushing filter cache and updating - nogo.**

FOOBAR-UBO ON

FOOBAR-UBO OFF

yeah, test:
@@||static.xx.fbcdn.net/rsrc.php/*AdS.js$script

blocked request => https://static.xx.fbcdn.net/rsrc.php/v3iSCm4/yk/l/en_US/X4_OU6L-AdS.js?_nc_x=EA96FTBcx-i

Thank you. Let me know if you want me to test a new one.

On Fri, Jul 24, 2020 at 1:50 AM mapx- notifications@github.com wrote:

the "bad" filter was removed from EL
easylist/easylist@c1f97f3
https://github.com/easylist/easylist/commit/c1f97f31158db947ed6566a855dd73ac8831f8d3


You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/uBlockOrigin/uAssets/issues/3367#issuecomment-663393939,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAPJ66BN2CULUSSGHKIMLZ3R5E4MTANCNFSM4FSO62AA
.

Someone have new filters? The @anktkr one isn't working anymore since today
It's really annoying I don't even play Fortnite ffs

image

Edit it's still working but in a weird way I need to hover the word sponsored first to make the ad disappear sooo..

ezgif-6-d2de8355275a

OMG a saw new logon page (like "material/flat design"):

obraz | obraz
--- | ---

version with long text:

and new ID for posts:

<div data-pagelet="FeedUnit_{n}">

try maybe this:

##div[data-pagelet*="FeedUnit"]:has(span[class] + [role*="n"] > span > span + span)

or:

##div[data-pagelet*="FeedUnit"]:has(span[class] + [role*="n"] > span > span + span:matches-css-before(content: attr(data-content)))

PS. I don't have Suggested for You so I can't block this...

Are they for mobile site?

Better add exclusions for mobile and touch version.

~m.facebook.com,~touch.facebook.com

Didn't work for me :c

For my still works:

obraz |
--- |

Also don't hover post and text "Sponsored". Then the fasting is rebuilt and the filter may not grasp.

When I select a sponsored post with uBlock Origin I have this result
First ad
##div:nth-of-type(2) > .sjgh65i0.l9j0dhe7.k4urcfbm.du4w35lb > .l9j0dhe7.du4w35lb > div > div > .lzcic4wl > .cbu4d94t.j83agx80 > .du4w35lb.l9j0dhe7.rq0escxv > .k4urcfbm.l9j0dhe7.j83agx80
Second ad
##div:nth-of-type(8) > .sjgh65i0.l9j0dhe7.k4urcfbm.du4w35lb > .l9j0dhe7.du4w35lb > div > div > .lzcic4wl > .cbu4d94t.j83agx80 > .du4w35lb.l9j0dhe7.rq0escxv > .k4urcfbm.l9j0dhe7.j83agx80 > .sbcfpzgs.k4urcfbm.stjgntxs.ni8dbmo4.l82x9zwi.uo3d90p7.pw54ja7n.ue3kfks5.hybvsw6c.du4w35lb.l9j0dhe7.rq0escxv > div > div:nth-of-type(2) > div
Third ad
##div:nth-of-type(14) > .sjgh65i0.l9j0dhe7.k4urcfbm.du4w35lb > .l9j0dhe7.du4w35lb > div > div > .lzcic4wl > .cbu4d94t.j83agx80 > .du4w35lb.l9j0dhe7.rq0escxv > .k4urcfbm.l9j0dhe7.j83agx80 > .sbcfpzgs.k4urcfbm.stjgntxs.ni8dbmo4.l82x9zwi.uo3d90p7.pw54ja7n.ue3kfks5.hybvsw6c.du4w35lb.l9j0dhe7.rq0escxv > div > div:nth-of-type(2) > div
Hope it may help you figuring out how to block it
Edit : I guess it's pretty useless what I just gave you since normal posts have the same thing too

No help, all post have crap classes "div > .sjgh65i0.l9j0dhe7.k4urcfbm.du4w35lb > .l9j0dhe7.du4w35lb > div > div > .lzcic4wl > .cbu4d94t.j83agx80 > .du4w35lb.l9j0dhe7.rq0escxv > .k4urcfbm.l9j0dhe7.j83agx80 > .sbcfpzgs.k4urcfbm.stjgntxs.ni8dbmo4.l82x9zwi.uo3d90p7.pw54ja7n.ue3kfks5.hybvsw6c.du4w35lb.l9j0dhe7.rq0escxv > div > div:nth-of-type(2) > div"

After hover should works - PC layout only:

facebook.com,~m.facebook.com,~touch.facebook.com##div[data-pagelet*="FeedUnit"]:has(span[class] + a[role*="link"] > span[aria-label] > span[aria-label] + span)

facebook change div[role*="button"] to a[role*="link"] when detect move mouse / hover on text.

Maybe the HTML code can help? You will find here the whole div of a sponsored post (for some reason it's pretty big..)
Sponsored div.txt

OK, now I see is no always use [aria-label].

filter after delete not stable aria-label:

##div[data-pagelet*="FeedUnit"]:has(span[class] + [role*="n"] > span > span + span)


maybe faster die, but analyzes the postion of the elements in the post:

##div[data-pagelet*="FeedUnit"]:has(span[class]:first-child + [role*="n"] > span:only-child > span:first-child + span:last-child)

I tried facebook.com##div[data-pagelet*="FeedUnit"]:has(span[class] + [role*="n"] > span > span + span) and it's working, thank you very much, you're a hero!

is this breaking anything? : facebook.com##[href^="https://l.facebook.com/l.php?"] 😶 for me remove the ads, but i dont know a lot about filters etc.. 🤣

with that filter:

https://i.imgur.com/TudX7CL.png

no filter:

https://i.imgur.com/7caEF3K.png

@PIZZA90 It's just a page that redirect to the external URL (with tracking parameter for sure)

  • u = Encoded URL
  • h = Random string that likely similar to fbclid

That's mean it's remove any posts that contains external URL

I'm back and actually it's just for the "Suggested for You" posts, I'm tired of them, so if someone have some free time to help me to get rid of them it will be nice.

HTML code :
Suggested for you div.txt

Also I have "Suggested for You" in real place:

https://user-images.githubusercontent.com/35370833/92309137-32d8d400-efa3-11ea-8adb-cc403a894d5d.png

Propozycje dla Ciebie ~ Suggested for You

##span[dir="auto"]:has-text(Suggested for You):upward(div[data-pagelet*="FeedUnit"])

or

##div[data-pagelet*="FeedUnit"]:has(span[dir="auto"]:has-text(Suggested for You))

IMO second is better/lighter for CPU:

151 span[dir="auto"] check vs 14 div[data-pagelet*="FeedUnit"] check.

I have no idea how to detect this without basing it on the words of the specified language.

That was fast, it's working perfectly, thank you again kind hero!

They have not yet broken down the words so that the letters have a separate html element and, in addition, some false letters ones in between.

If they do so, the filter will fall off immediately.

Since it's not ads, I don't think they will change anything soon because I don't think they gain money from that.

I've been using this lately, second one might match regular posts with Suggested for You in it but idc. The first one seems solid afaict.

facebook.com##div[data-pagelet*="FeedUnit"]:has(div[aria-label="Sponsored"])
facebook.com##div[data-pagelet*="FeedUnit"]:has-text(Suggested for You)

No solid if your FB interface use other language than English (French, Spanish, Portugese, German, Chinese).

No solid if your FB interface use other language than English (French, Spanish, Portugese, German, Chinese).

You can replace Sponsored with whatever it is in your language

No always is exist [aria-label] attrib:

https://github.com/uBlockOrigin/uAssets/issues/3367#issuecomment-664154583 + https://github.com/uBlockOrigin/uAssets/issues/3367#issuecomment-664181226

So for few user needed added hidden "pokemon" or "strange regex":

  • SsSsPpOooOnnNnnsSsoOOrRroOoOWwWaAanNnEeE - short "Sponsorowane".

  • /S.*p.*o.*n.*s.*o.*r.*o.*w.*a.*n.*e/ - maybe match too many posts.


Besides, maybe they're trying to disable our vigilance - back works the simple filters and in a few days they'll turn back the strange way they generate words and clicks with javascript events instead of the simple [href] with html.

facebook.com##div[data-pagelet*="FeedUnit"]:has(div[aria-label="Sponsored"])
facebook.com##div[data-pagelet*="FeedUnit"]:has-text(Suggested for You)

shouldn't the first one be hidden by facebook.com##div[data-pagelet*="FeedUnit"]:has(span[class] + [role*="n"] > span > span + span)? FB banned my test account lol.

Now facebook no use many <span>-s; so filter no longer match:

> span > span + span and > span:only-child > span:first-child + span:last-child

Okay...so maybe I need to create a new account unless you find a new global solution or someone tells me the Japanese translation of "Sponsored" (usually "スポンサード" but sometimes not).

  • おすすめ = Suggested for You/Propozycje dla Ciebie/Рекомендуется вам

but sometimes not

  • 広告 / aria-label="広告" = strict Advert/advertisement no translated form "Sponsored".

So not "Sponsored" but "Ad" - Similar to Russian visionary: Реклама ("Reklama"), also not use "Sponsored".

I gave up and started using Facebook Purity. No issues now and even keeping
the old Facebook rather than the new one with loads of other options

On Sun, 4 Oct 2020 at 15:39, krystian3w notifications@github.com wrote:

おすすめ - Suggested for You
広告 / aria-label="広告" - "Advert"/"Reklama", so not "Sponsored"


You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/uBlockOrigin/uAssets/issues/3367#issuecomment-703265141,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AGEAT3E7E2EYS32ETM2VWPLSJCCJZANCNFSM4FSO62AA
.

facebook.com##div[data-pagelet*="FeedUnit"]:has(div[aria-label="Sponsored"])
facebook.com##div[data-pagelet*="FeedUnit"]:has-text(Suggested for You)

shouldn't the first one be hidden by facebook.com##div[data-pagelet*="FeedUnit"]:has(span[class] + [role*="n"] > span > span + span)? FB banned my test account lol.

Maybe, I was using more complex rules before.

No always is exist [aria-label] attrib:

#3367 (comment) + #3367 (comment)

So for few user needed added hidden "pokemon" or "strange regex":

* `SsSsPpOooOnnNnnsSsoOOrRroOoOWwWaAanNnEeE` - short "`Sponsorowane`".

* `/S.*p.*o.*n.*s.*o.*r.*o.*w.*a.*n.*e/` - maybe match too many posts.

Besides, maybe they're trying to disable our vigilance - back works the simple filters and in a few days they'll turn back the strange way they generate words and clicks with javascript events instead of the simple [href] with html.

Recently all my ads have had aria-label so I'll use it until it stops working. I wonder whether they care at all about accessibility - it would be pretty shitty if people using screen readers had a hard time telling what was an ad.

@krystian3w Thank you for taking time to investigate! I'll add them to my lists.

I feels like new Facebook somehow have similar element hint like mobile touch, such as [role="article"], that can identify as post item, with [data-testid="Keycommand_wrapper"] and [data-testid="Keycommand_wrapper_feed_story"] named at upper DOM node, even they also put the random and scramble [class] ID higher.

For example, I've done remove On this day promote in news feed in this experiment

And still, I never use the main desktop site for reading news feed (even I've forced and frequent to open recent instead of algorithm'd sorts), except pages only feed is seems to be okay to test.

Ads showing up in the middle of some videos (can only reproduce in the main feed, wasn't able to reproduce in the page's feed)

Screenshot 2020-10-08 102858 (3)

Screenshot 2020-10-08 102913 (3)

mid-roll ads also someone reported on reddit.

For "Suggested for You" maybe these no longer based on language:

##div[data-pagelet*="FeedUnit"]:has(div:not([class]):not([id]):empty ~ div:not([class]):not([id]) > div:not([class]):not([id]) > div:not([class]):not([id]):first-child:has(span[dir="auto"]:only-child) + div:not([class]):not([id]) + div:not([class]):not([id]) + div:not([class]):not([id]):last-child)

In short these post have one div with "specific" span, no added to normal/"sponsored" posts.

https://github.com/uBlockOrigin/uAssets/issues/8011#issuecomment-709369051 - ads in right column officialy back, EasyList hide for English comunnity only...

Don't know is they want to separate each letters after this or not...
You may need to change sponsored words in your language.
##div[data-pagelet="RightRail"] div[class] h3[dir]:has(span[dir]:has-text(/Sponsored/)):upward(7)

Or remove right pane entirely, if you want (of course, I am...)
##div[data-pagelet="RightRail"]:remove()

The right column block is useful, a marker when friends have logged out or you can have a permanent chat there pinned.

I agree, removing the whole panel will be a big waste.
Now, I just hope that someone will find a solution for the ads in the middle of videos.

Are

facebook.com##div[data-pagelet*="FeedUnit"]:has(div[aria-label="Sponsored"])
facebook.com##div[data-pagelet*="FeedUnit"]:has-text(Suggested for You)

obsolete now?

Because I have no interests to turn on the online status indicator to let others see me that I'm already online or I've just active in any moments ago, although you cannot hide yourself about how many time passed since you're online because Facebook will still expose your status by capturing user's interactons, such as like to, commented on, watched some videos, etc.

In fact, of course you need to turn your online status to on for just see how many ppls are online and/or ready to chat, include some notices about events, birthdays, etc. so it's up to your guys if you want to keep the right pane visible or not.

Are

facebook.com##div[data-pagelet*="FeedUnit"]:has(div[aria-label="Sponsored"])
facebook.com##div[data-pagelet*="FeedUnit"]:has-text(Suggested for You)

obsolete now?

Still working for me at least

I would suggest perhaps a test with :remove().

Sometimes I see a series of suggestions, e.g. 20 to 80 posts is just one.

Are

facebook.com##div[data-pagelet*="FeedUnit"]:has(div[aria-label="Sponsored"])
facebook.com##div[data-pagelet*="FeedUnit"]:has-text(Suggested for You)

obsolete now?

Still working for me at least

I'm surprised it's still working, I was using these for almost a month before posting here. I wasn't sure if a FB employee watching this thread would immediately fix their mistake in obfuscation.

As long as it is not globally available on the list, they probably do not care.

the filter of kowith337 is working, changing /Sponsored/ for Publicidad in spanish version

in: https://www.facebook.com/marketplace i made this filter and is hiding the ads:

facebook.com##a[aria-label="Enlace del anunciante"] 😆

Example with filter and no filter in marketplace page
Captura

@stephen304 Thx, probably I misinterpreted @krystian3w and @kowith337 's comments when they seem to discuss different ads.

Hompage =/= fb marketplace

@krystian3w Sorry but can you confirm the Japanese translation of Sponsored in ##div[data-pagelet="RightRail"] div[class] h3[dir]:has(span[dir]:has-text(/Sponsored/)):upward(7) is 広告 too?

Yes: 広告

obraz |
--- |

The advertisements do not match the interface language or IP from the VPN.

Thx!

PS. marketplace mixed English and Japanese, header "Sponsored" not was translated to: 広告 ("Advert").

Ads showing up in the middle of some videos (can only reproduce in the main feed, wasn't able to reproduce in the page's feed)

snip screenies)

Can confirm this on my side, seeing those ads in between videos. UBlock blocked these before, since last week they appeared. Guess I have to install another 3rd party extension to block them :/

Maybe AdGuard Base blocked mid-roll ads with +js( / redirect or simple block network filter:

subscribe: AdGuard Base for uBlock Origin

If Facebook use SSAI, uBO may no block this ads.

ads are back on homepage

image
image

aria-label="Sponsorisé" (sponsored)

this works
facebook.com##div[data-pagelet^="FeedUnit_"]:has(a[aria-label="Sponsorisé"])

I use this facebook.com##div[data-pagelet^="FeedUnit"]:has(a[aria-label="Sponsored"]), as the aria-label is localised. The a does have a semi-random href referring to a page with info about ads, so maybe that can be used

facebook.com##div[data-pagelet*="FeedUnit"]:has(div[aria-label="Sponsored"])

Stopped working for me so now I use

facebook.com##div[data-pagelet*="FeedUnit"]:has(span[aria-label="Sponsored"])

I'm keeping them both enabled since they seem pretty safe

facebook.com##div[data-pagelet*="FeedUnit"]:has(span[aria-label="Sponsored"])

This has the downside of blocking every post that has been sponsored, even if it isn't been shown on your feed as an ad (such as from pages you follow)

@Epse That's fine by me heh

even if it isn't been shown on your feed as an ad (such as from pages you follow)

One attrib [aria-label="Sponsored"] is embeded on all posts, so span maybe is a bait:

<span aria-label="Sponsored">

An a tag with that attribute is only embedded on actual ads

Hello
I found something there. But the list is getting too big

www.facebook.com ## div: nth-of-type (2)> .sjgh65i0.l9j0dhe7.k4urcfbm.du4w35lb> .l9j0dhe7.du4w35lb

www.facebook.com ## div: nth-of-type (3)> .sjgh65i0.l9j0dhe7.k4urcfbm.du4w35lb> .l9j0dhe7.du4w35lb

www.facebook.com ## div: nth-of-type (7)> .sjgh65i0.l9j0dhe7.k4urcfbm.du4w35lb> .l9j0dhe7.du4w35lb

www.facebook.com ## div: nth-of-type (8)> .sjgh65i0.l9j0dhe7.k4urcfbm.du4w35lb> .l9j0dhe7.du4w35lb

div: nth-of-type (2)
the number changes because someone can do something.

No help - crap compressed CSS clasess, maybe not stable.


Also:

I suppose all posts have .sjgh65i0.l9j0dhe7.k4urcfbm.du4w35lb > .l9j0dhe7.du4w35lb

Do not rely on picker-generated rules. Right-click on the ads, Inspect element, and take screenshots.

Through all the cat and mouse with facebook, this rule has continued to pay dividends :laughing:

facebook.com##div[data-pagelet*="FeedUnit"]:has-text("Many failed before. Will YOU complete the trial")

Hello, since few days facebook get flooded with Sponsored ads again, this rule do not work anymore:

# Anti Adblock facebook.com #3367
# https://github.com/uBlockOrigin/uAssets/issues/3367
facebook.com##div[data-pagelet^="FeedUnit_"]:has(a[aria-label="Gesponsert"])
facebook.com##div[data-pagelet^="FeedUnit_"]:has(a[aria-label="Sponsored"])
facebook.com##div[data-pagelet^="FeedUnit_"]:has(a[aria-label="Create ad"])

As looking for a solution for this issue, I found a chrome extension which works surprising well

https://chrome.google.com/webstore/detail/fblock-sponsored/njcnnfelhkehnacoabhefefkbmloakkf

Looking truh the sourcecode I found this:

/**
 * @file F.Block Sponsored 2.9.6
 * @copyright F.Block Sponsored 2020
 */
$(function(){let e=function(){let e,i=$(document),n=0;function t(e){0!==e.length&&(e.remove(),chrome.runtime.sendMessage({blockedCount:++n}))}if($("#MNewsFeed").length){let n='div[data-sigil="m-feed-voice-subtitle"] > :first-child:not(a)',o="article";function s(){t($(this).closest(o))}function d(){t($(this).not(":has(*)").closest(o))}return e="article > header",t($(n).closest(o)),t($(e).not(":has(*)")),i.unbindArrive(n,s),i.unbindArrive(e,d),i.arrive(n,s),void i.arrive(e,d)}let o='div[data-pagelet^="FeedUnit_"]',a='div[role="feed"] div .qzhwtbm6.knvmm38d > span > span[id]:not([class]) > a:nth-child(2)[role="link"]';function s(){const e=$(this).children();e.length&&t(e.eq(0).closest(o))}function d(){t($(this).not(":has(> a)").closest(o))}e='div[class="dati1w0a hv4rvrfc"] > div > div > div > span',t($(a).closest(o)),t($(e).not(":has(> a)").closest(o)),i.unbindArrive(a,s),i.unbindArrive(e,d),i.arrive(a,s),i.arrive(e,d)};e(),$(window).bind("hashchange",e)});

Can someone so kind and make a working rule from this for uBlock? So I don't relay on another extension to keep facebook clean.

Thanks!

@spec1re See https://www.reddit.com/r/uBlockOrigin/comments/kejwbz/facebook_sponsored_posts/.

@Yuki2718

Thanks a bunch, works again!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Jose1971AB picture Jose1971AB  ·  3Comments

macheteBadger picture macheteBadger  ·  3Comments

sebastianbell picture sebastianbell  ·  3Comments

ghost picture ghost  ·  3Comments

Jose1971AB picture Jose1971AB  ·  3Comments